2013-01-06 39 views
0

地圖我不明白這是什麼一段代碼確實插入到輸入C++

static TwoWayHostPair hostpair; 
map <TwoWayHostPair, Traffic> mymap; 
//here some map element inserted to mymap and hostpair initialized 

map <TwoWayHostPair, Traffic>::iterator iter = mymap.begin(); 
iter = mymap.find(hostpair); 
if (iter == mymap.end()) { 
    iter = mymap.insert(make_pair(hostPair, Traffic())).first; //line8 
} 

我的問題是在line8會發生什麼?我沒有得到它。它不應該是map<...>:iterator類型,並在此插入後它保持相同的類型?

回答

4

std :: map :: insert return std :: pair < iterator,bool>,下面的語句是正確的。第二布爾返回值指示插入是否發生

iter = mymap.insert(make_pair(hostPair, Traffic())).first; //line8 

見參考文獻here

+0

謝謝,讚賞 – smttsp

1

這裏所用,

iter = mymap.insert(make_pair(hostPair, Traffic())).first; //line8 

mymap.insertreturns一個pair<iterator,bool>first,然後,accessesiterator

+0

謝謝,讚賞 – smttsp

0
insert(make_pair...... 

make_pair用於對值插入到一個已經map.You迭代用於在具有hostpair地圖的所有元件。

編輯 請參閱cplusplus map瞭解更多。

+0

那部分是相當明顯的,我問的是由內特錢德勒和比爾茲回答下面 – smttsp

0
iter = mymap.find(hostpair); 
if (iter == mymap.end()) { 
    iter = mymap.insert(make_pair(hostPair, Traffic())).first; //line8 
} 

第一行看起來關鍵hostPair在地圖,並且如果沒有找到,則它進入if塊在那裏它與它的值一起插入鍵,.first返回迭代器到插入的項目。


改進

但是你可以做的改進這一點。你可以只寫:

iter = mymap.insert(make_pair(hostPair, Traffic())).first; 

這正是相當於你的代碼。不需要使用find,然後使用insert。結果是獲得了性能

如果鍵已經存在,insert功能將不插入任何項目地圖和.first將返回迭代器到發現項目。如果密鑰不存在,只有它將插入並且.first會將迭代器返回到新插入的項目。

如果你想知道開關是否已經存在或者沒有,那麼你可以這樣做:

auto pair = mymap.insert(make_pair(hostPair, Traffic())); //NO .first! 
if (pair.second) 
{ 
    //a newly created item is inserted 
    auto iter = pair.first; //iterator to the newly inserted item 
} 
else 
{ 
    //an item with key `hostPair` already exists in the map 
    auto iter = pair.first; //iterator to the found item 
} 

希望有所幫助。