2012-10-02 83 views
0

所以,我有這樣的情況:推矢量<double>到矢量<矢量<double>>

vector<vector<double>> myVector; 
myVector.resize(somePreviousObject.size()); 
for(int i = 0; i < myVector.size(); i++) 
{ 
    vector<double> tempVector; 
    //Do some stuff that fills tempVector, in a loop 
    //After loop: 
    myVector[i].push_back(tempVector); 
} 

然而,這將產生一個編譯錯誤,指出:

no matching function for call to 'std:;vector<double, std::allocator<double > >::push_back(std::vector<double, std::allocator<double> >&)' 
...stl_vector.h:733 note: candidates are: void std::vector<_Tp, _Alloc>::push_back(const _Tp&) [with _Tp = double, _Alloc = std::allocator<double>] 

我認識到使用矢量向量不是性能友好的,但它仍然應該編譯和執行,正確嗎?爲什麼不呢?

感謝您的幫助。

回答

8

在表達式:

myVector[i].push_back(tempVector); 

子表達式myVectorstd::vector<std::vector<double>>myVector[i]std::vector<double>&,並push_back上該矢量需要double,而不是一個std::vector<double>

看起來你要設置的個元素是tempVector,如果這是你應該做的情況下(對,你不這樣語句後需要tempVector的假設):

myVector[i].swap(tempVector); 

(雖然myVector[i] = tempVector;將具有相同的淨效應,這將更加昂貴,因爲它會分配和複製所有的內容。該swap移動tempVector內容到myVector[i]在幾乎沒有成本的(三分球掉期) )

我知道有人會出現並建議使用myVector[i] = std::move(tempVector),這在C++ 11中也很好,但在C++ 03中不可用。兩者的區別在於,在swap的情況下,myVector[i]的原始內容保證在操作後的tempVector之內(在這種情況下,myVector[i]是空的,所以它無關緊要)。另一方面,myVector[i] = std::move(tempVector);之後的tempVector的狀態在標準中未定義,它可以將向量留空,或者可以交換它或......唯一的保證是移動之後可以銷燬對象tempVector

+0

我認爲利用'swap'來進行常量值的賦值(在這種情況下,你想放棄源代碼)可以很好地隱藏在析構函數中執行swap()的小助手對象中。像'container_update > tmp(myVector [i]);'它在內部維護一個std :: vector ,並在'tmp'對象超出範圍時立即用myVector [i]交換它。 –

+0

@FrerichRaabe:我明白你的意思,但我不同意。代碼應該清楚它的功能。如果操作比較複雜,我會加一個幫手,但是我認爲沒有意義。另外請注意'swap'有其他副作用('tmpVector'變化),看看這個函數調用可能並不明顯。最後,我會發現通過完全刪除代碼並使用引用可以更容易地閱讀:'std :: vector &tempVector = myVector [i];'(但這意味着即使舊分配行沒有達到) –

+0

啊啊,我覺得真的很傻。我將堅持使用C++ 03交換方法而不是C++ 11移動,因爲我無法保證用戶基礎將具有C++ 11。感謝幫助! –

2

這是不是

myVector[i] = tempVector; 

myVector.push_back(tempVector); 

既然你調整你的載體事先,我假設你想要的第一個版本。

在你的代碼中,請記住myVector[i]本身就是vector<double>,這就是爲什麼它不起作用。

+0

最大的可能是,他居然想'myVector [我] .swap(tempVector)' ... –

+0

@DavidRodríguez-dribeas之前從未使用過。比'='好嗎? –

+0

它不會分配空間並將所有內容從'tempVector'複製到'myVector [i]',而是移動內容(即沒有內存分配,沒有副本,只有三個指針交換)。看到我的答案。 –

0
vector<vector<double>> myVector; 

應該是:

vector<vector<double> > myVector; 

然後

myVector[i].push_back(tempVector); 

應該

myVector.push_back(tempVector); 
+0

第一個區別取決於編譯器。 C++ 11使該語法有效,所以我們不能再讓VS接受無效的語法。 –

相關問題