插入在c ++中键入map

时间:2013-01-06 06:50:15

标签: c++ map iterator

我不明白这段代码是做什么的

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,并且在此插入之后它是否保持相同的类型?

4 个答案:

答案 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)

insert(make_pair......

make_pair用于将对值插入地图。您已经迭代了具有hostpair的地图中的所有元素。

修改 请参阅cplusplus map了解详情。

答案 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
}

希望有所帮助。