是否有一个与multimap等价的.at()

Is there a .at() equivalent for a multimap?

本文关键字:at 有一个 multimap 是否      更新时间:2023-10-16

对于特定的键,是否有任何方法可以获得迭代器到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++中可能吗?还是我们必须在multimap中一个元素一个元素地循环,并在开始工作之前检查键?

您必须查找单个键值对(任何与键匹配的键),或equal_range以获得与给定键匹配的所有对(这似乎是您的最佳选择)

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)
相关文章: