关于multimap的查找以及修改问题

multimap容器允许key值重复,利用其自带的“查找”功能可以找到某个key值对应的value值。但如果我想修改其中某个key值对应的value值(里面有重复的key),应该如何解决?

先根据key值查找,再根据value来去重。

先说怎么解决吧,multimap不支持像map一样通过下标直接修改元素,例如

map<string,int> m;
m["alen"] = 100;

以int或者char作为key,使用equal_range,可以获取所有该key的迭代器,但是修改起来也不能随机访问进行修改

#include <iostream>
#include <map>
using namespace std;

multimap<int, int> m;
int main()
{
        m.insert(make_pair(1,2));
        m.insert(make_pair(1,3));
        m.insert(make_pair(2,1));
        auto it_pair = m.equal_range(1);
        for (auto it = it_pair.first; it != it_pair.second; ++it)
        {
                cout << it->first << ":" << it->second << endl; //1:2 1:3
                it->second = 5;
        }
        it_pair = m.equal_range(1);
        for (auto it = it_pair.first; it != it_pair.second; ++it)
                cout << it->first << ":" << it->second << endl;  //1:5 1:5

}

我这里以string作为键值为例,你可以通过容器转换来修改,思路就是把multimap中重复的数据另存到vector或list等其他容器中,使用std::pair来作为中间类型,进行转换,然后删除multimap中重复的,在vector中修改后,再重新插入multimap,如下


#include <iostream>
#include <map>
#include <string>
#include <vector>
using namespace std;

multimap<string, int> m;
int main()
{
        m.insert(make_pair("abc",2));
        m.insert(make_pair("abc",3));
        m.insert(make_pair("mnc",1));
    
        //将map中的重复元素添加到vector,使用std::pair存储,删除
        vector<std::pair<string, int>> v;
        for (auto it = m.begin(); it != m.end(); ++it)
        {
                if(it->first == "abc")
                {
                    std::pair<string, int> p;
                    p.first = it->first;
                    p.second = it->second;
                    v.push_back(p);
                    m.erase(it->first);
                }
        }
        //在vector中修改变得容易,怎么修改看你自己的需求,根据下标即可修改,修改后插入map
        for (auto it = v.begin(); it != v.end(); ++it)
        {
                cout << it->first << ":" << it->second << endl;  
                m.insert(*it);
        }
        //输出修改后的数据
        for (auto it = m.begin(); it != m.end(); ++it)
        {
                cout << it->first << ":" << it->second << endl;  
        }
}

但其实你有频繁的修改和插入时候,就可以考虑直接使用vector<std::pair<string,int>>或者list<std::pair<string,int>>了,map和multimap说白了还是方便我们查找的容器。