как переместить все пары с одной карты std :: map на другую - PullRequest
4 голосов
/ 06 марта 2012

Предположим, у меня есть следующее:

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

Какой самый прямой способ переместить все пары ключ / значение из m1 в m2?

Я бы ожидал:

  • m1 будет пустым после этой операции
  • м2 может изначально иметь пары
  • те пары в м2, которые не имеют одинаковыеключ как m1 должен быть оставлен в покое
  • те пары в м2, которые имеют тот же ключ, что и m1, должны быть перезаписаны парами m1

Нужна ли комбинация вызовов из <algorithm>?

Решение

Решение Джеймса Кранза удовлетворяет моим требованиям.

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

Рекомендация Иоахима Пилеборга будет работать, только если m2и у m1 нет одинакового ключа (т.е. значение m2 не будет перезаписано значением m1 для того же ключа)

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

Ответы [ 2 ]

5 голосов
/ 06 марта 2012

Самое очевидное решение - просто написать цикл самостоятельно:

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_back или push_front, вам нужно использовать более общий insterter, который в свою очередь требует итератор указав, где вставка должна иметь место. За исключением того, что std::map обрабатывает этот итератор как & ldquo; подсказку & rdquo; и, поскольку он обычно не будет хороший намек, он будет проигнорирован.

  2. Вы фактически должны скопировать из m2 в m1, так как вставка в Карта не будет перезаписывать любое существующее значение, и когда ключ присутствует на обеих картах вы хотите сохранить значение от m1.

5 голосов
/ 06 марта 2012

Как насчет std::move?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...