【发布时间】:2014-08-10 06:36:30
【问题描述】:
到目前为止,我还没有发现,我完全不知道 std::vector 的性质。
让我解释一下:
Vector 是可增长的,对吧?这意味着,在它内部必须以某种方式动态分配/重新分配内存。像这样的:
class vector {
private:
int *data;
};
好的。但是这样的定义意味着如果我们通过引用或值将 std::vector 传递给另一个函数——这两种类型的参数传递之间没有区别,并且两个函数都能够修改数据(除非向量是作为 const 传递)。
但是!我尝试了以下方法,但我的想法失败了:
void try_to_modify(vector<int> v) {
v[2] = 53;
}
int main() {
vector<int> v(3);
v[2] = 142;
try_to_modify(v);
cout << v[2] << '\n'; // output is: 142
return 0;
}
那么真相在哪里? std::vector 到底是什么?
谢谢。
【问题讨论】:
-
看一个实现。例如,libc++。它会像人们期望的那样进行深层复制。
-
你忘记了它有一个复制数据的复制构造函数
-
@TheParamagneticCroissant 呃,不。这种行为实际上是有道理的。这不是一个“怪癖”。这就是值类型应该的工作方式。此外,这与 C 中的行为完全相同。
-
@TheParamagneticCroissant,当你通过值传递时,实际上并没有通过引用传递。对我来说似乎很简单。您只需要知道 C++ 具有值语义。
-
这是与C完全相同的行为。
std::vector<int>是一个值,他传递了一个值,它被复制并且函数有它自己的独立副本。它不是指针或引用类型。这是一个值。你对std::vector<int>和int*的心智模型非常、非常破碎和错误。