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