如何有效地修改std :: map?

时间:2012-02-12 18:21:18

标签: c++ map forwarding

考虑这种情况:

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

1 个答案:

答案 0 :(得分:3)

您无法使用标准地图执行此操作。但如果您的问题是特定的,您可以考虑单独传递新元素:

void doSmth1(std::map<int, int> const & m, int newkey, int newvalue);

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

更新:如果您真的只想要一张地图,并且复制地图是不可能的,那么您可以通过以下方式实施@ arrowdodger的建议,对原始地图进行临时修改:< / p>

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;
    }
}