2012-03-27 129 views
0

假設我想聲明一個對象向量。我可以這樣做 -如何高效,正確地在對象中插入對象

vector<mynode> nodes; 

但是,如果mynode的大小很大,這將是不好的。所以我想這樣做 -

vector<mynode*> nodes; 

但上述聲明有一個明顯的問題,我存儲的地址,它根本不安全。舉例來說,如果我在福爾循環添加對象 -

vector<mynode*> nodes; 
for (int i=0; i<10; i++) 
{ 
    mynode mn; 
    nodes.push_back(&mn); 
} 

這將導致錯誤,因爲我不能保證如果指針的內容實際上是確定。

所以,我決定使用此聲明 -

vector<mynode&> nodes; 
for (int i=0; i<10; i++) 
{ 
    mynode mn; 
    nodes.push_back(mn); 
} 

是這樣行嗎?安全?它提供了第一行本身的彙編。請建議一些將對象存儲在向量中的有效方法。非常感謝。

+1

不,存儲引用和存儲指針一樣糟糕。如果頻繁插入並且會減慢程序速度,請考慮使用另一個數據結構('deque'?)或'std :: vector >'。另外:您的問題名稱與問題本身不符。 – 2012-03-27 18:14:26

+3

不要擔心優化矢量,除非您的剖析顯示它是一個實際問題。第一種形式'矢量'是最好的。 – 2012-03-27 18:15:53

+0

@MooingDuck,存儲引用是不可能的,因爲引用不能被重新分配。 – 2012-03-27 18:16:32

回答

3

我能做到這樣 -

vector<mynode> nodes; 

但如果MYNODE的尺寸較大,這將是糟糕的。

不,它不會。無論如何你需要存儲對象。如果你擔心複製大對象,你有一些解決方案:

  1. 使用std::vector<std::unique_ptr<my_node>>(或其它智能指針),它在破壞自動釋放的對象。如果my_node是多態的,這是最好的解決方案。
  2. 使用std::vector<my_node>並使用emplace_back函數來構建對象(注意,如果您使用的是Visual Studio 2010,則該函數不會執行它應該執行的操作)。
  3. 還在用std::vector<my_node>

    v.push_back(std::move(some_node));

    使用push_back與右值引用,以移動已構造的對象。

無論如何,一個好的經驗法則是將複製構造函數/賦值刪除(或私有)爲大多數非輕量級對象。容器仍然是功能性的(再次提供您使用C++ 11),您的擔憂是沒有意義的。

+0

在以下位置添加缺少的空格:std :: vector > – stanwise 2012-03-27 18:32:19

+1

@stanwise:不適用於C++ 11。 – 2012-03-27 18:55:08

+0

錯過了更新,謝謝你讓我知道。 – stanwise 2012-03-27 20:35:26

0

我沒有看到指針在這裏很糟糕。這不是無效或什麼。在你的例子中插入引用保存對位於堆棧上的臨時對象的引用,這將會超出範圍...

+0

在這裏使用原始指針*是*不好,因爲它不是異常安全的(C++的難度主要來自異常安全性問題):如果在沒有對象被釋放的情況下異常傳播到上游,則內存泄漏。 – 2012-03-27 18:25:31

1

使用引用給出的基本上與使用指針相同(這只是你不需要在代碼中解引用它們)。 如果您想自動確保插入到矢量的對象不會被刪除而不復制它們,您應該使用來自boost或C++ 11的智能指針。

vector< smart_ptr<mynode> > nodes; 
for (int i=0; i<10; i++) 
{ 
    smart_ptr<mynode> mn = new mynode(); 
    nodes.push_back(mn); 
} 
+0

要創建一個有10個節點的矢量,那麼'std :: vector 節點(10);' – 2012-03-27 18:28:43

+0

@BoPersson - 當然,但我只是想在OP提供的同一個案例中顯示使用示例。 – stanwise 2012-03-27 18:30:52

相關問題