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

kfm*_*e04 4 c++ stl c++11

假设我有以下内容:

std::map<KEY,VALUE> m1;
std::map<KEY,VALUE> m2;
Run Code Online (Sandbox Code Playgroud)

什么是从移动所有键/值对的最直接的方式m1进入m2

我希望:

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

我需要一组来电<algorithm>吗?

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

for( const auto& p : m1 )
  m2[ p.first ] = p.second;
m1.clear();
Run Code Online (Sandbox Code Playgroud)

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

std::move( m1.begin(), m1.end(), std::inserter( m2, m2.begin() ));
Run Code Online (Sandbox Code Playgroud)

Som*_*ude 5

怎么样std::move


Jam*_*nze 5

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

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

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

std::copy( m2.begin(), m2.end(), std::inserter( m1, m1.end() ) );
m2.clear();
m2.swap( m1 );
Run Code Online (Sandbox Code Playgroud)

这不完全是直观的,我会毫不犹豫地使用它而没有评论,因为:

  1. 由于std::map没有push_back或者push_front,您需要使用更通用的insterter,这又需要一个迭代器来指定插入的位置.除了std::map 将这个迭代器视为"暗示",并且由于它通常不会是一个好的提示,它将被忽略.

  2. 实际上,你必须从复制m2m1,因为插入的地图将不会覆盖任何现有的值,当关键是存在于地图,你想保持距离值m1.