c++ - 如何有效地修改 std::map?

标签 c++ dictionary 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 并转发它从其调用者收到的 map 。但是,它必须添加一个额外的键值对(或者如果它已经存在则覆盖它)。我想避免为了将附加值传递给 doSmth1 而复制整个内容。

最佳答案

标准 map 无法做到这一点。但如果您的问题非常具体,您可以考虑单独传递新元素:

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

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

更新:如果您真的只想要一张 map ,而复制 map 是不可能的,那么您可以按照@arrowdodger 的建议对原始 map 进行临时修改:

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

关于c++ - 如何有效地修改 std::map?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9251353/

相关文章:

c++ - STL 中 std::vector 的 reserve() 实现

c++ - 模板映射的设计问题采用不同的结构

java - 数据结构集、列表、映射还是树?

.htaccess - 如何将域名转发到现有 URL - .htaccess、DNS 记录,还有什么?

java - 端口转发在 android 模拟器中不起作用

c++ - Malloc导致内存泄漏

c++ - "Double or Nothing"赌博机代码无法超过15连击

c++ - 如何重复打印相同的值?

python - 如何读取 2 列 csv 文件并创建字典?

ruby-on-rails - 将 DNS 指向 heroku rails 应用程序上的子目录?