【问题标题】:Is there a .at() equivalent for a multimap?多图是否有 .at() 等效项?
【发布时间】:2025-12-25 21:00:12
【问题描述】:

对于特定的键,有什么方法可以让一个多映射的迭代器?例如:

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++ 中可能吗?还是我们只需要在多映射中逐个元素地循环,并在执行工作之前检查键?

【问题讨论】:

标签: c++ map iterator multimap


【解决方案1】:

find 用于单个键值对(任何与键匹配),或equal_range 用于获取与给定键匹配的所有对(这似乎是您最好的选择。)

【讨论】:

    【解决方案2】:

    multimap&lt;Key, T&gt;只按照Key对元素进行排序,所以我们只能找到所有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&lt;T&gt;

    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)
    

    【讨论】: