2012-05-15 67 views
1

我正在尋找最有效的方法來複制矢量列表中的矢量內容。我想盡量避免內存重新分配。C++:向量列表的高效副本

我的問題如下: 我有:

  • 一個std::vector<int> v含有N個元素

  • 矢量std::vector< std::vector<int>* > vlist

  • 的列表,並且我知道元素的總數vlist矢量中的M是< = N (N和M可以非常大)

我想複製vlist中的所有元素(首先是vlist [0]中的所有元素,然後是vlist [1]等所有元素...),並在最後減小v的大小到M(我的項目不使用C++ 2011)。

如何儘可能有效地做到這一點?

非常感謝。

編輯:評論:v已經填充了N個元素,我想用來自其他向量的M(< = N)元素替換它們。

+0

如果你想避免內存分配,那麼你不能真正得到一個副本,你可以得到一個參考。您可以引用一個對象,也可以創建一個對象的副本,最直觀的選擇可能是在複製時重新使用內存(這可以節省內存分配)。既然你的vector包含int,你將會把它們放在堆棧上,這樣比在堆上分配要快。 – Kiril

回答

1

我不知道這是否是最有效的方式,但這是方式

std::vector<int> v; 
std::vector< std::vector<int>* > vlist; 
int j = 0; 
for(int i = 0; i < vlist.size(); ++i) { 
    std::copy(vlist[i]->begin(), vlist[i]->end(), &v[j]); 
    j += vlist[i]->size(); 
} 
v.resize(j); 

如果你真的想最有效的方式,您可能需要實現幾個不同的方式並比較它們的速度。

+0

OP說沒有C++ 11 –

+0

謝謝,錯過了。 –

0

最有效的方法是不復制它。你的應用程序做什麼需要它?另外,爲什麼你有vector<* vector<int> >而不是隻有vector<vector<int> >?圍繞它設計,使用pimpl,懶惰副本等。

最後,我不確定你認爲你可以做什麼,這將打敗std的默認拷貝構造函數。你有沒有分析你的應用程序,以確定默認ctor是一個瓶頸?

0
std::vector<int> v; 
v.reserve(N); 
for(size_t i = 0; i<vlist.size(); i++) 
{ 
    v.insert(v.end(), vlist[i]->begin(), vlist[i]->end()); 
} 

這應該是足夠有效的,如果M接近N.否則,最好分配內存之前計算M和使用v.reserve(M)。

+3

您的意思是使用儲備而非調整大小?你也是這樣說的:'vlist [i] - > begin()'和'vlist [i] - > end()' –

+0

使用'v.reserve(N)'而不是'v.resize(N)'。調整實際大小首先將數據設置爲默認值,而預留僅分配空間。 – andre

+0

謝謝,它現在已經修復。 –