如何将所有对从一个std :: map移动到另一个

时间:2012-03-06 13:57:29

标签: c++ stl c++11

假设我有以下内容:

std::map<KEY,VALUE> m1;
std::map<KEY,VALUE> m2;

m1的所有键/值对移动到m2的最直接方法是什么?

我希望:

  • m1在此操作后为空
  • m2最初可能有成对
  • m2中与m1不具有相同键的那些对应该单独留下
  • m2中与m1具有相同密钥的对应该用m1的对覆盖

我是否需要<algorithm>的来电组合?

解决方案

James Kranze的解决方案满足了我的要求。

for( const auto& p : m1 )
  m2[ p.first ] = p.second;
m1.clear();

Joachim Pileborg的建议仅在m2和m1没有相同的密钥时才有效(即m2的值不会被同一密钥的m1值覆盖)

std::move( m1.begin(), m1.end(), std::inserter( m2, m2.begin() ));

2 个答案:

答案 0 :(得分:5)

std::move怎么样?

答案 1 :(得分:5)

最明显的解决方案就是自己写一个循环:

for ( std::map<KEY, VALUE>::const_iterator current = m1.begin();
        current != m1.end();
        ++ current ) {
    m2[current->first] = current->second;
}

否则,我认为以下内容应该有效:

std::copy( m2.begin(), m2.end(), std::inserter( m1, m1.end() ) );
m2.clear();
m2.swap( m1 );

这并不完全直观,我毫不犹豫地使用它 评论,因为:

  1. 由于std::map没有push_backpush_front,您需要 使用更通用的insterter,而后者又需要迭代器 指定插入的位置。 std::map除外 将此迭代器视为“提示”,因为它通常不会成为一个 好的提示,它将被忽略。

  2. 您实际上必须从m2复制到m1,因为插入到m1 map不会覆盖任何现有值,并且当密钥存在时 在两个地图中,您希望保留{{1}}的值。