【问题标题】:Why std::vector<int> contents are eliminated when passing them by value?为什么 std::vector<int> 内容在按值传递时会被消除?
【发布时间】: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


【解决方案1】:

我没有足够的代表发表评论,所以我会发布一个答案。 您发布的代码对我有用,但您应该知道,当您传递显示的 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;
}

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

【讨论】:

  • 是的,你是对的,这可以正常工作,但我宁愿通过值而不是通过引用传递向量。我现在正在尝试重新安装 Visual Studio,希望能解决问题。如果这能解决问题,我会发布答案,如果没有,我会在这里发表评论。
【解决方案2】:

我发布此答案是因为我设法解决了并且我想分享如何解决。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-26
    • 1970-01-01
    • 2023-01-20
    相关资源
    最近更新 更多