【问题标题】:change values of multiple elements in std::multimap by key按键更改 std::multimap 中多个元素的值
【发布时间】:2013-02-25 13:08:43
【问题描述】:

我正在使用std::multimap

std::multimap<string,string> map;

它包含以下元素

1 2  
2 3
3 2
1 2
1 0

我想用 X 替换所有的 1 和 2。我在 google 中搜索了很长时间,但没有得到结果。我试过了

for(it=mmap.begin();it!=mmap.end();it++)
{
   if(it->first == "1" || it->first == "2")
   {
     key = it->second;
     it.erase(it);
     mmap.insert(pair<string,string>("X",key));
   }
}

但结果错误。我知道大小每次都会变化,当我们插入元素时,元素会被插入到最后,这反过来又结束了 for 循环。有没有其他办法摆脱这种情况?

【问题讨论】:

  • 该代码无法编译。
  • 参见std::multimap::lower_bound() 以及其中指向std::multimap::upper_bound() 的链接参考。他们会得到你正在寻找的范围,尽管我质疑你在像这样枚举它的同时修改地图的愿望。

标签: c++ multimap


【解决方案1】:

您在迭代容器时正在修改它,这很糟糕。

我建议您存储所有要替换的值,删除它们,然后放回您想要的所有值。

或者只是创建具有所需值的新地图

【讨论】:

    【解决方案2】:

    我知道大小每次都不同,当我们插入元素时,元素会在最后插入

    不,它不会,它会在保持顺序的位置插入一个新元素。

    你需要做的是这个。

    // for "1"
    while (auto I = mmap.lower_bound ("1"), I != mmap.end())
    {
        mmap.insert(pair<string,string>("X",I->second));
        mmap.erase (I);
    }
    
    // Same for "2"
    while (auto I = mmap.lower_bound ("2"), I != mmap.end())
    {
        mmap.insert(pair<string,string>("X",I->second));
        mmap.erase (I);
    }
    

    【讨论】:

    • 非常确定你希望 both 那些.end()s 是.upper_bound(..)
    猜你喜欢
    • 1970-01-01
    • 2014-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-10
    • 1970-01-01
    • 1970-01-01
    • 2011-02-08
    相关资源
    最近更新 更多