2013-03-14 162 views
2

在下面的代碼中,有3個對象d1和d2被創建用於執行push_back()。 其中一個在我創建時,一個在調用v.push_back()時,另一個在它實際上被複制到{我不確定}的向量中時。std :: vector中的高效push_back

如果不在C++ 03中使用std :: vector,避免這種情況會是什麼樣的最佳選擇?

#include <iostream> 
#include <vector> 
#include <string> 

using namespace std; 

struct Details 
{ 
    string fname; 
    string lname; 
    string address; 
    int age; 
}; 

int main(int argc, char **argv) 
{ 
    vector<Details> v; 

    Details d1; 
    d1.fname = "vivek"; 
    d1.lname = "kumar"; 
    d1.address = "New Delhi"; 
    d1.age = 25; 

    v.push_back(d1); 

    Details d2; 
    d2.fname = "some name"; 
    d2.lname = "some lastname"; 
    d2.address = "some address"; 
    d2.age = 25; 

    v.push_back(d2); 

    return 0; 
} 
+0

我的項目仍然使用C++ 03標準。 – dearvivekkumar 2013-03-14 14:14:36

+2

不要試圖優化你沒有評估過的問題。您可能最終得到不必要的複雜代碼,這是*問題。 – DevSolar 2013-03-14 14:19:12

+0

困惑。你想把同一個對象放入一個向量兩次? – rileyberton 2013-03-14 14:19:59

回答

6

調用std::vector::push_back()本身並不創建副本,因爲傳遞了一個const引用。它只創建成爲向量元素的副本。這個副本是std::vector的語義所要求的。

你也可以push_back()Details在複印時是相對便宜的時間:如果你真的已經確定性能是最重要的這裏,那麼你將需要/執行引用語義

Details d1; // Now the 3 strings of d1 are still small 
v.push_back(d1); // essentially copies 3 empty strings and an int. 
v.back().fname = "vivek"; 
v.back().lname = "kumar"; 
v.back().address = "New Delhi"; 
v.back().age = 25; 
+0

仍然是一個不需要的副本。 – dearvivekkumar 2013-03-14 14:24:57

+0

如果你不希望它複製數據使用'矢量'。 – andre 2013-03-14 14:26:48

+0

@andre與智能指針的任何組合,以避免動態資源管理 – dearvivekkumar 2013-03-14 14:29:11

1

  • 在C++ 11你有移動的語義,所以你會實現的詳細結構的移動構造函數,所以我通常會強烈建議使用
  • 由於您使用C++ 03,你可以使用boost :: shared_ptr來包裝你的Details結構,如下所示:vector<boost::shared_ptr<Details> >。由於您使用的是C++ 03,請注意>之間的空格字符。
  • 通常我會推薦unique_ptr而不是shared_ptr,但unique_ptr僅在C++ 11中可用,其中移動語義替代方案在大多數情況下都更好。
  • 我不推薦原始指針的原因是因爲你需要手動管理他們的內存,這是一個禁忌。

至於你的例子,請注意在C++ 03中push_back需要一個const引用,所以只涉及到你的結構的一個副本。使用我上面建議的任何方法仍然會執行一個副本,但副本的大小將被保留,並且不會隨着結構的大小而擴展,這可能正是您在處理大型數據。

+0

我可以使用矢量>? – dearvivekkumar 2013-03-14 14:40:38

+0

你沒有提到你正在使用的編譯器。從你的評論我假設VC90或更低。但是,是的,tr1 :: shared_ptr應該沒問題,只要它對您可用。 – 2013-03-14 14:43:44

相關問題