如果我使用下面的代码向向量添加元素,那么在我调用foo时,vec的元素(自动变量)已被破坏,因为它们的创建范围结束。
std::vector<A> vec;
for (int i = 0; i < n; i++) {
A a;
vec.push_back(a);
}
foo(vec);
我现在的问题是这个问题的教科书解决方案是什么
答案 0 :(得分:2)
不,vec
中的元素将是a
的不同副本。
但是,如果您要使用vec
或使用operator[]
,则需要分配vec.push_back()
的尺寸:
for (int i = 0; i < n; i++) vec.push_back(A());
编辑(改变问题后):
即使push_back()
将其参数作为参考,但在内部它会复制它。它通过引用引用它来避免在将副本存储到内部之前制作不必要的副本。
答案 1 :(得分:0)
不要担心堆栈变量。当你在std :: vector中推送值时,这个容器会创建变量的堆副本。因此,当你在范围内时,你的所有变量都将存在。
答案 2 :(得分:0)
你可以将你的变量定义为全局变量,在你的循环中只需让该变量中的值然后再推回