Как я могу скопировать одну карту в другую, используя std :: copy? - PullRequest
19 голосов
/ 01 мая 2010

Я хотел бы скопировать содержимое одной std :: map в другую. Могу ли я использовать std::copy для этого? Очевидно, что следующий код не будет работать:

int main() {
  typedef std::map<int,double> Map;
  Map m1;
  m1[3] = 0.3;
  m1[5] = 0.5;
  Map m2;
  m2[1] = 0.1;
  std::copy(m1.begin(), m1.end(), m2.begin());
  return 0;
}

Это не будет работать, потому что copy вызовет operator* на m2.begin(), чтобы "разыменовать" его и присвоить значение (все значения имеют тип std::pair<const int, double>). Затем он вызовет operator++, чтобы перейти к следующему пробелу в m2. Обе эти операции не работают из-за const в const int и нет места, зарезервированного для каких-либо новых элементов.

Есть ли способ заставить его работать с std::copy?

Спасибо!

Ответы [ 2 ]

71 голосов
/ 01 мая 2010

Вы можете использовать ответ GMan --- но вопрос в том, почему вы хотите использовать std::copy? Вместо этого вы должны использовать функцию-член std::map<k, v>::insert.

m2.insert(m1.begin(), m1.end());
21 голосов
/ 01 мая 2010

Вам нужен вариант вставного итератора :

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

inserter определено в <iterator>. Требуется место для вставки (следовательно, m2.end()) и возвращает insert_iterator.

...