多图的是否有.at()等价物?

时间:2014-03-20 05:13:15

标签: c++ map iterator multimap

对于特定键,有没有办法让迭代器成为多图?例如:

multimap<string,int> tmp;
tmp.insert(pair<string,int>("Yes", 1));
tmp.insert(pair<string,int>("Yes", 3));
tmp.insert(pair<string,int>("No", 5));
tmp.insert(pair<string,int>("Maybe", 1));
tmp.insert(pair<string,int>("Yes", 2));

multimap<string,int>::iterator it = tmp.at("Yes);

然后我可以使用it来完成我想做的工作。这在C ++中是否可行?或者我们是否必须逐个元素地循环遍历多图,并在完成工作之前检查密钥?

2 个答案:

答案 0 :(得分:4)

您有一个键值对find(任意与键匹配),或equal_range获得与给定键匹配的所有对(这似乎是您最好的选择。)

答案 1 :(得分:2)

multimap<Key, T>仅按Key排序元素,因此我们只能找到键值等于"Yes"的所有元素,然后逐个检查每个元素。

typedef multimap<string,int>::iterator Iterator;
pair<Iterator, Iterator> iter_range = tmp.equal_range("Yes");
Iterator it;
for (it = iter_range.first; it != iter_range.second; ++it) {
    if (it->second == 3) {
        break;
    }
}
if (it != tmp.end()) {
    tmp.erase(it);
}

事实上,在这种情况下最好使用multiset<T>

multiset< pair<string, int> > temp;
temp.insert(make_pair("Yes", 1));
temp.insert(make_pair("Yes", 3));
multiset< pair<string, int> >::iterator iter = temp.find(make_pair("Yes", 1));
if (iter != temp.end()) {
    temp.erase(iter); // it erase at most one element
}
temp.erase(make_pair("Yes", 3)); // it deletes all the elements that equal to make_pair("Yes", 3)