0

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

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

4 回答 4

4

std::map::insert return std::pair< iterator,bool >,下面的语句是正确的。第二个 bool 返回值指示插入是否发生

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

在此处查看参考

于 2013-01-06T07:01:22.593 回答
1

如此处所用,

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

mymap.insert 返回一个pair<iterator,bool>first,然后,访问.iterator

于 2013-01-06T07:01:31.317 回答
0
insert(make_pair......

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

编辑 参考cplusplus 地图了解更多。

于 2013-01-06T07:02:04.000 回答
0
iter = mymap.find(hostpair);
if (iter == mymap.end()) { 
    iter = mymap.insert(make_pair(hostPair, Traffic())).first; //line8
}

第一行在map 中查找key hostPair,如果找不到,则进入if插入 key 及其值的块,并将.first迭代器返回到插入的项。


改进

但是您可以对此进行改进。你可以这样写:

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

这完全等同于您的代码。无需使用findthen 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
}

希望有帮助。

于 2013-01-06T07:05:06.073 回答