【问题标题】:Changing values of elements in a vector using a function [duplicate]使用函数更改向量中元素的值
【发布时间】:2022-01-28 21:54:40
【问题描述】:

我今天刚开始学习 C++,所以我不知道我是在引用原始向量还是副本。我试图将向量中所有元素的值加倍(从 1、2、3 到 2、4、6),但向量总是打印原始值。任何提示表示赞赏!

void doubleVector(vector<int> vec) {
    for (int i = 0; i < vec.size(); ++i) {
        vec[i] = vec[i] * 2;
    }
}

int main() {
    vector<int> vect{ 1, 2, 3 };
    doubleVector(vect);
    for (int x : vect) {
        std::cout << x << ' ';
    }
}

【问题讨论】:

  • 那是副本。 void doubleVector(vector&lt;int&gt; &amp; vec) 将通过引用传递。
  • 无关:你可以写for (int &amp; val:vec) { val *= 2; }。这让编译器可以为您找出所有的迭代逻辑,就像main 中的循环一样。请注意,val 也是防止对副本进行操作的引用。
  • 不幸的是,虽然这个确切的问题可能有超过一千个重复项,但用于描述帖子的白话和标题使得它们在搜索关键术语时几乎无法找到。简短的顺序是,您按值传递向量,因此实际上仅更改了本地向量 vec。它与非复杂对象相同:例如(int x) 然后x = x+1;;会遭受同样的命运。更改为引用 vector&lt;int&gt; &amp;vec 将提供您寻求的行为。
  • @OP 不管是简单的int 还是std::vector&lt;std::vector&lt;std::vector&lt;int&gt;&gt;&gt;。 C++ 中的变量是按值传递的(创建一个副本),除非您特别声明要通过引用传递。这是 Python 或 Java 等语言与 C++ 之间的最大区别。
  • 有趣的是void func(type * pointer) pointer 指向的内容是通过一种引用传递的,并且可以在func 内部进行修改,具有持久的效果,但pointer 本身是通过值传递的,并且复制。如果您需要更改pointer 指向func 的位置,则需要通过引用传递pointervoid func(type * &amp; pointer)

标签: c++ vector


【解决方案1】:

如果你想改变一个对象,你需要通过引用的指针来传递它。

在这里,您将vector&lt;int&gt; vec 传递给函数doubleVector,它将复制您的向量而不是传递它。

将其替换为void doubleVector(vector&lt;int&gt;&amp; vec),它将正常工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多