将循环中的元素添加到容器(生存期)

Adding elements in loop to container (lifetime)

本文关键字:生存期 添加 循环 元素      更新时间:2023-10-16

如果我使用下面的代码将元素添加到向量中,那么在调用foo时,vec的元素(自动变量)已经被销毁,因为它们在其中创建的范围结束了。

std::vector<A> vec;
for (int i = 0; i < n; i++) {
  A a;
  vec.push_back(a);
}
foo(vec);

我现在的问题是,对于这样一个问题,教科书上的解决方案是

否,vec中的元素将是a的不同副本。

但是,如果要使用operator[]或使用vec.push_back():,则需要分配vec的大小

for (int i = 0; i < n; i++) vec.push_back(A());

编辑(问题更改后):

即使push_back()将其参数作为引用,它也会在内部复制它。它逐个引用它的参数,以避免在复制到内部存储之前生成不必要的副本。

不要担心堆栈变量。当您在std::vector中推送值时,这个容器会创建变量的堆副本。因此,当你生活在这个范围内时,你所有的变量都会存在。

您可以将变量定义为全局变量,在循环中只让该变量中的值,然后返回