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