2013-08-22 33 views
0

假設我有類型的變量以下兩個表達式等價:是否涉及地圖

std::map<int,std::vector<std::string>> m; 

現在聲明A是:

m[2].push_back("SomeString"); 

和聲明B是:

std::vector<std::string> t = m[2]; 
    m[2]=t.push_back("SomeString"); 

我想知道B是否等於A.

我問這個的原因是因爲在這個link上它指出STL對象進行復制。然而,對我來說,聲明A似乎會返回一個參考。有關這裏發生的事情的任何建議?

+7

你的例子甚至不會編譯。 –

+2

s/pushback/push_back? – doctorlove

+6

即使您忽略明顯的拼寫錯誤,這也沒有多大意義 – nijansen

回答

2

operator[]std::map< class Key, class Value用於獲取對應於特定鍵(實際上,它返回一個引用,但w/e)的值。在你的情況,你會使用這樣的:

碼片1

std::map<std::string,std::vector<std::string>> m; 
<...> 
std::string the_key_you_need("this is the key"); 
std::vector<std::string> value = m[the_key_you_need]; 
value.push_back(<...>) 

這是不一樣的:

碼片2

std::map<std::string,std::vector<std::string>> m; 
<...> 
m[the_key_you_need].push_back(<...>); 

因爲在第一個中,您正在製作一個副本m[the_key_you_need]命名爲value,並將新字符串複製到副本,這意味着它不會在m中結束。第二個是正確的做法。

另外,m[<something>] = value.push_back(<something_else>)將不起作用,因爲vector::push_back()返回void。如果你想要做這種方式,你將需要:

碼片3

std::map<std::string,std::vector<std::string>> m; 
<...> 
std::string the_key_you_need("this is the key"); 
std::vector<std::string> value = m[the_key_you_need]; 
value.push_back(<...>) 
m[the_key_you_need] = value;//here you are putting the copy back into the map 

在這種情況下,代碼段2和3確實是相當的(但這段代碼2更好,因爲它不會創建不必要的副本)。

+0

說明它返回一個參考解釋了很多。我問的原因是,我讀到STL與副本一起工作,它總是返回一個副本,並使傳遞的對象的副本http://stackoverflow.com/questions/14074289/does-passing-stl-containers-make-a -複製。也許我誤解了答案 – Rajeshwar

+0

@Raje,我已經編輯了一些答案,以進一步澄清它。你可以檢查map的運算符[]'的確是返回一個引用[here](http://en.cppreference.com/w/cpp/container/map/operator_at) – SingerOfTheFall

+0

所以問題是在這種情況下它返回的是複製或參考? – Rajeshwar