如何有效地修改std::map

How to efficiently amend an std::map?

本文关键字:map std 修改 有效地      更新时间:2023-10-16

考虑这种情况:

void doSmth1(std::map<int,int> const& m);
void doSmth2(std::map<int,int> const& m) {
  std::map<int,int> m2 = m;
  m2[42] = 47;
  doSmth1(m2);
}

其思想是doSmth2将调用doSmth1并转发从其调用者接收到的映射。但是,它必须添加一个额外的键值对(如果已经存在,则覆盖它)。我希望避免为了向doSmth1传递一个附加值而复制整个内容。

使用标准映射无法做到这一点。但是,如果你的问题很具体,你可能会考虑单独传递新元素:

void doSmth1(std::map<int, int> const & m, int newkey, int newvalue);
void doSmth2(std::map<int, int> const & m)
{
    doSmth1(m, 42, 47);
}

更新:如果你真的只想要一张地图,而复制地图是不可能的,那么下面是你如何实现@arrowdocker的建议,对原始地图进行临时修改:

void doSmth2(std::map<int, int> & m)
{
    auto it = m.find(42);
    if (it == m.end())
    {
        m.insert(std::make_pair(42, 49));
        doSmth1(m);
        m.erase(42);
    }
    else
    {
        auto original = it->second;
        it->second = 49;
        doSmth1(m);
        it->second = original;
    }
}
相关文章: