为什么 std::vector<int> 内容在按值传递时被消除?

Why std::vector<int> contents are eliminated when passing them by value?

本文关键字:按值传递 gt vector std lt int 为什么      更新时间:2023-10-16

我有一个大小为 4 的初始化 std::vector,我正在尝试将其传递给一个函数,该函数必须对其执行某种计算并返回结果。通过调试,我注意到如果我按值传递向量,一旦我输入函数,向量的大小就变为 0,而容量正确为 4。为了理解哪个是问题所在,我编写了一个非常简单的代码,它具有相同的问题。

// @main.cpp
#include "fcn.h"
int main() {
    std::vector<int> vect;
    vect.push_back(0);
    vect.push_back(1);
    vect.push_back(2);
    vect.push_back(3);
    // As it should, at this point in the debugger vect.size() == 4
    printValues(vect);
    return 0;
}

// @fcn.h
#include <iostream>
#include <vector>
using namespace std;
void printValues(vector<int> vect);

// @fcn.cpp
#include "fcn.h"
void printValues(vector<int> vect) {
    // As soon as I get here, vect.size() == 0
    for (int i = 0; i < vect.size(); i++) 
        std::cout << "vect[" << i << "] = " << vect[i] << endl;
}

我很确定我以前做过很多次,我不知道为什么这次它不起作用。原因可能是微不足道的,但我看不出来。只有当我通过引用传递向量时,问题才会"解决",但这对我来说似乎很奇怪。

最后但并非最不重要的一点是,如果我尝试初始化vect

vect = {0, 1, 2, 3};

调试器没有std::vector.push_back(),而是告诉我vect的容量为 4,但大小为 0。不知道这是否有任何相关性。

我没有足够的代表发表评论,所以我会发布一个答案。您发布的代码对我有用,但您应该知道,当您按照所示传递 std::vector 时,将创建矢量的副本(以及内容(并将其传递给 printValues(..( 函数。也许副本在您的系统上无法正常工作。通过将 std::vector 作为引用传递,原始向量被传递给函数,该函数应保留 std::vector 'vect' 的所有值和属性。我建议进行以下更改:

void printValues(std::vector<int> &vect);
void printValues(std::vector<int> &vect) {
//...
for (size_t i = 0; i < vect.size(); i++)
    std::cout << "vect[" << i << "] = " << vect[i] << std::endl;
}

注意:我做了一些调整,以便在我的系统上进行干净的编译。

我发布这个答案是因为我设法解决了,我想分享如何解决。

正如许多人指出的那样,我编写的代码绝对没有问题,而是 std::vector 库有问题。我通过卸载VS14并重新安装来解决。

我完全不知道为什么会发生这种情况,因为我什至不知道 STL 文件的存储位置。