2011-12-17 30 views
9

可以說我有一個動態分配的對象。 如果我將它推入STL向量,將引用插入向量或此對象的副本?std :: vector插入對象的副本或引用?

這是一個普遍的問題。例如:

class vec { 
vector<obj> vec; 
void addToVec(obj a) { 
    // insert a into vec 
} 
    ... 
    ... 
    ... 
} 

obj* a = new obj; 
vec* v = new vec; 
vec.addToVec(a); 

如果我刪除v,也會反對死亡?

+1

請顯示您正在考慮的代碼:-) – 2011-12-17 14:18:22

+4

我的說教方面出來了,我覺得我必須告訴你,你很可能不是指STL而是C++標準庫。 – Corbin 2011-12-17 14:20:19

+1

C++標準庫已經爲其容器和算法採用了STL。所以,從技術上講,STL向量與C++庫向量相同。 – 2011-12-17 14:23:24

回答

8

將引用插入向量或此對象的副本?

複製(這意味着你的class應該是複製能力,否則編譯器錯誤)。

說明性:不能在std::vector<>中指定參考文獻。此外,這裏的對象具有更廣泛的意義,它可以是一個正常的變量或指針,但std::vector<>只接受副本。

更新:Post C++ 11,大部分標準容器都使用「右值API方法」提供對象std::move();在那裏可能不會執行副本。

+0

我很驚訝,我認爲編譯器會在某些情況下優化複製操作,但發現它沒有:http://ideone.com/b4fpc即使使用g ++ -O6 – matiu 2011-12-17 14:40:04

+0

這一個演示瞭如何昂貴複製操作可以通過複製一個131 KB的對象:http://ideone.com/UNKyr – matiu 2011-12-17 14:58:16

2

你檢查過reference

void push_back (const T& x); 

添加元素在向量的末尾添加一個新元素,其目前的最後一個元素之後。 這個新元素的內容被初始化爲x的副本。

這有效地將矢量大小增加1,如果矢量大小等於調用前的矢量容量,則會導致內部分配存儲的重新分配。重新分配無效所有以前獲得的迭代器,引用和指針

7

如果您已經動態分配T類型的對象,你推指向對象std::vector<T*>,然後將鼠標指針的副本是推。如果取消引用指針並將結果推送到std::vector<T>,則會創建該對象的副本。收藏集始終進行復制。因此,指針集合使指針的副本和類實例的集合本身(使用拷貝構造IIRC)複製實例本身。

相關問題