如果我使用下面的代碼向元素添加元素,那麼在我調用foo時,vec的元素(自動變量)已被銷燬,因爲它們的範圍創建結束。將循環中的元素添加到容器中(lifetime)
std::vector<A> vec;
for (int i = 0; i < n; i++) {
A a;
vec.push_back(a);
}
foo(vec);
我的問題是什麼現在的教科書解決這樣的問題是
如果我使用下面的代碼向元素添加元素,那麼在我調用foo時,vec的元素(自動變量)已被銷燬,因爲它們的範圍創建結束。將循環中的元素添加到容器中(lifetime)
std::vector<A> vec;
for (int i = 0; i < n; i++) {
A a;
vec.push_back(a);
}
foo(vec);
我的問題是什麼現在的教科書解決這樣的問題是
不,vec
元素將是a
不同的副本。
但是,你需要的,如果你想使用operator[]
或者使用分配的vec
大小vec.push_back()
:
for (int i = 0; i < n; i++) vec.push_back(A());
:
即使push_back()
接受其參數爲一個參考,在內部它會複製它。它通過引用引用它的參數,以避免在將副本存儲在內部之前進行不必要的副本。
爲什麼?他們通過參考傳遞 – user695652 2012-07-11 08:53:53
不,該作業製作了「a」的副本。 – hmjd 2012-07-11 08:54:37
對不起,我把例子改爲vec.push_back(a); – user695652 2012-07-11 08:55:20
不要擔心堆棧變量。當你在std :: vector中插入值時,這個容器會創建變量的堆副本。因此,當你活在範圍內時,所有的變量都會存在。
您可以定義變量,全局和在循環只是讓該變量的值,然後推回
它有點調皮的編輯當你引用你的原代碼 – mathematician1975 2012-07-11 08:57:33
答案的問題是的,我很抱歉,但問題得到了更清楚的push_back功能 – user695652 2012-07-11 08:59:06
爲什麼downvoted ?? – user695652 2012-07-11 08:59:29