我不明白这段代码是做什么的
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
}
我的问题是第8行会发生什么?我没弄明白。它不应该是类型map<...>:iterator
,并且在此插入之后它是否保持相同的类型?
答案 0 :(得分:4)
std :: map :: insert return std :: pair&lt; iterator,bool&gt; ,下面的语句是正确的。第二个bool返回值表示插入是否发生
iter = mymap.insert(make_pair(hostPair, Traffic())).first; //line8
参见参考here
答案 1 :(得分:1)
如此处所用,
iter = mymap.insert(make_pair(hostPair, Traffic())).first; //line8
mymap.insert
returns一个pair<iterator,bool>
。 first
,然后accesses iterator
。
答案 2 :(得分:0)
答案 3 :(得分:0)
iter = mymap.find(hostpair);
if (iter == mymap.end()) {
iter = mymap.insert(make_pair(hostPair, Traffic())).first; //line8
}
第一行在地图中查找<{em>}的键hostPair
,如果找不到,则会进入if
块,并在其中插入键及其value,.first
将迭代器返回到插入的项目。
<强>改进强>
但是你可以对此做出改进。你可以这样写:
iter = mymap.insert(make_pair(hostPair, Traffic())).first;
与您的代码完全相同 。无需使用find
,然后使用insert
。结果是性能增益。
如果密钥已经存在,insert
函数将不会向地图插入任何项目,.first
将返回 found 项的迭代器。如果该密钥不存在,则只有它将插入,.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
}
希望有所帮助。