2012-07-11 54 views
-1

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

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

foo(vec); 

我的问题是什么现在的教科书解决这样的问题是

+1

它有点调皮的编辑当你引用你的原代码 – mathematician1975 2012-07-11 08:57:33

+0

答案的问题是的,我很抱歉,但问题得到了更清楚的push_back功能 – user695652 2012-07-11 08:59:06

+0

为什么downvoted ?? – user695652 2012-07-11 08:59:29

回答

2

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

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

EDIT(后问题变化)
for (int i = 0; i < n; i++) vec.push_back(A()); 

即使push_back()接受其参数为一个参考,在内部它会复制它。它通过引用引用它的参数,以避免在将副本存储在内部之前进行不必要的副本。

+0

为什么?他们通过参考传递 – user695652 2012-07-11 08:53:53

+0

不,该作业制作了“a”的副本。 – hmjd 2012-07-11 08:54:37

+0

对不起,我把例子改为vec.push_back(a); – user695652 2012-07-11 08:55:20

0

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

0

您可以定义变量,全局和在循环只是让该变量的值,然后推回