c++ - 如何替换 std multimap 中的 <key, value>

标签 c++ multimap

重述问题 - 问题改写 - 我有一个要求,我需要用新的键和值替换一对。考虑这个 -

#include <map>
#include <string>
#include <iostream>

using namespace std;

int main()
{
    std::multimap<unsigned int, std::string> mymap;

    mymap.insert(std::multimap<unsigned int, std::string>::value_type(0, "A1"));
    mymap.insert(std::multimap<unsigned int, std::string>::value_type(0, "A2"));
    mymap.insert(std::multimap<unsigned int, std::string>::value_type(2, "C1"));
    mymap.insert(std::multimap<unsigned int, std::string>::value_type(2, "C2"));
    mymap.insert(std::multimap<unsigned int, std::string>::value_type(1, "B1"));
    mymap.insert(std::multimap<unsigned int, std::string>::value_type(1, "B2"));
    mymap.insert(std::multimap<unsigned int, std::string>::value_type(1, "B3"));

    std::pair<std::multimap<unsigned int, std::string>::iterator, std::multimap<unsigned int, std::string>::iterator> pr = mymap.equal_range(1);

    std::multimap<unsigned int, std::string>::iterator it;
    for (it=pr.first; it!=pr.second; ++it)
    {
        unsigned int key = it->first;
    key = key+10;

        std::string val = it->second;
        val = "X" + val;
        mymap.erase(it);
        mymap.insert(std::multimap<unsigned int, std::string>::value_type(key, val));

    }

    for ( it=mymap.begin() ; it != mymap.end(); it++ )
    {
        cout << (*it).first << " => " << (*it).second << endl;
    }

    return 0;

}

由于迭代器无效,程序在 visual studio 2008 上崩溃。

我希望它是:

0 => A1
0 => A2
2 => C1
2 => C2
11 => XB1
11 => XB2
11 => XB3

我的想法是我想用新条目替换 map 中的现有条目。

我做错了什么?非常感谢任何帮助。

最佳答案

诀窍是先推进迭代器,然后删除迭代器的拷贝。

std::multimap<unsigned int, std::string>::iterator it = pr.first;
while (it != pr.second)
{
    unsigned int key = it->first;
    key = key+10;

    std::string val = it->second;
    val = "X" + val;

    std::multimap<unsigned int, std::string>::iterator itCopy = it;
    ++it;
    mymap.erase(itCopy);
    mymap.insert(std::multimap<unsigned int, std::string>::value_type(key, val));
}

在 C++11 中,您可以这样做:

std::multimap<unsigned int, std::string>::iterator it = pr.first;
while (it != pr.second)
{
    unsigned int key = it->first;
    key = key+10;

    std::string val = it->second;
    val = "X" + val;

    it = mymap.erase(it);
    mymap.insert(std::multimap<unsigned int, std::string>::value_type(key, val));
}

顺便说一下,因为这段代码每次都在增加键,所以它会一遍又一遍地处理每个元素。

关于c++ - 如何替换 std multimap 中的 <key, value>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11343822/

相关文章:

java - 合并两个具有重复键的 Map (Map<String, Map<String, Object>>)

java - 构建多重映射的正确方法

C++ multimap 查找失败

c++ - Trie 数据结构实现的 bug

c++ - 转换 DirectX 接口(interface)

c++ - 为什么 std::cin.clear() 在这个简单的程序中不起作用?

c++ - 静态变量与堆栈变量 : thread safety vs stack size?

c++ - Visual Studio 创建错误大小的窗口和错误的系统指标

c++ - 插入到 multimap 导致段错误

c++ - 同一 multimap 中的嵌套迭代