【发布时间】:2017-04-05 12:00:59
【问题描述】:
我有一个大小为 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};
调试器告诉我vect 的容量为 4,但大小为 0,而不是 std::vector.push_back()。不知道这是否有任何相关性。
【问题讨论】:
-
也许您在发布的代码中遗漏了什么?为我工作。
-
您在这个例子中也有同样的行为吗?还是只有原版?我没有尝试,但是如果该代码有问题,我会感到非常惊讶
-
我正在编译这个确切的代码,但它不工作。
-
当您说它不起作用时,您是在谈论调试器所说的内容,还是代码的实际行为方式?如果这是调试器所说的,那么您可能已经编译了“发布”版本而不是“调试”版本。也就是说,您需要关闭优化并使用调试符号进行编译,以使调试器为您提供正确的输出。
-
您平台上的
std::vector复制构造函数似乎有问题。检查编译器和标准库的完整性。
标签: c++ vector stl parameter-passing stdvector