2012-07-11 56 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

您可以定義變量,全局和在循環只是讓該變量的值,然後推回