为什么 std::vector<int> 内容在按值传递时被消除?
Why std::vector<int> contents are eliminated when passing them by value?
我有一个大小为 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 文件的存储位置。
相关文章:
- 何时应通过引用传递矢量参数而不是按值传递矢量参数?
- C++类 - 初始化列表 - 递归 - 按值传递
- 将函数参数完美转发到函数指针:按值传递呢?
- 棘手的按值传递和按引用递归问题传递
- 不同于按值传递和常量引用传递的程序集
- 按值传递变量与按引用传递变量具有相同的结果
- 为什么按值传递QStringView比引用常量更快?
- 获取 std::函数以推断按引用传递/按值传递
- 在函数中按值传递 unordered_map/unordered_set 是否有效? C++
- C++/11 auto 关键字是在更有效时推导参数进行按引用传递,还是始终按值传递?
- 使用 enable_if 在按值传递与按引用传递之间更改函数声明
- 防止在按值传递对象(继承)时进行切片
- 按值传递类和结构
- C++按引用传递还是按值传递?
- 为什么在按值返回时创建临时对象,而不是在按值传递给函数参数时创建临时对象
- 可移动但不可复制的对象:按值传递还是按引用传递?
- const-ref传递的模板化参数是否经过优化,以便在足够小时按值传递
- 在C++中指针是按值传递的吗
- shared_ptr构造函数参数是否应按值传递
- 使用 std::move 将参数传递给函数,如果该参数声明为按值传递或使用移动操作数 &&,是否有区别?