2013-07-29 129 views
1

假設我有一些物體,如:C++參考VS局部變量

std::map<int, std::vector<double> > some_map; 

簡單問題:被更有效地執行以下操作

std::vector<double> vec = some_map[some_index]; 

或引用它

std::vector<double>& vec = some_map[some_index]; 

任何人都可以簡單地解釋一下幕後發生的典型事件嗎?

非常感謝!

回答

7

兩者有不同的語義,不可互換。 第一個給你一個副本,你可以修改你想要的 ,但不需要改變地圖中的任何東西。第二個給出 你對地圖中的數據元素的引用;任何 修改修改地圖的內容。此外,儘管 可能不是問題,但請注意,如果地圖在參考超出範圍之前被破壞 ,則引用將爲 懸停。

關於性能,它取決於向量中的內容, 以及之後的處理方式;在大多數情況下,參考 可能會有更好的性能,但您不應該擔心 它直到探查器說您必須。 (如果你使用 參考,使其const,除非你真的希望能夠 修改地圖的內容。)

4

創建引用更高效,但您應該注意這兩個語句在語義上有所不同,並且具有不同的行爲。

如果你

std::vector<double> vec = some_map[some_index]; 

std::vector的拷貝構造函數被調用到整個矢量some_map[some_index]複製到vec。用這種方法,你會得到一個新的新的矢量vec。它們是獨立的對象,對vec的任何更改都不會影響原始地圖。

如果使用

std::vector<double>& vec = some_map[some_index]; 

然後vec直接指some_map[some_index]並避免複製。但是,請注意,如果稍後更改vec,則更改將反映在vecsome_map[some_index]之間,因爲它們指向相同的對象。爲了防止不希望的變化,這是更安全的使用量引用:

const std::vector<double>& vec = some_map[some_index]; 
+1

在語義的不同可能比任何性能上的差異更爲重要。 –

+0

2不同的實現有2個不同的目標,通過值聲明變量使您能夠修改變量,而不會有修改原始值的風險。 – Subhajit

1

引用是更有效,無論是在所使用的內存的術語和CPU週期。您的第一行代碼創建了一個向量的副本,其中包括複製向量中的每個項目。第二,你只是指現有的矢量。沒有複製。

+0

謝謝你,詹姆斯只是快一點:-) –