Есть ли быстрый способ заменить два содержимого карты? - PullRequest
1 голос
/ 22 сентября 2011

В моем коде у меня есть карта, которая содержит большой объем данных (~ 100 МБ), мне нужно скопировать все эти данные с одной карты на другую.В настоящее время я делаю это с помощью swap , но, насколько я понимаю, , swap - отличный способ сделать копию.Есть ли способ просто перенести память, используемую двумя картами?Я думаю, что я могу сделать это с помощью указателей, но я надеялся на более элегантный способ.

Ответы [ 2 ]

5 голосов
/ 22 сентября 2011

23.2.1 [container.requirements.general] ISO / IEC 14882: 2011 содержит список общих требований к контейнерам.Для всех стандартных контейнеров выражения a.swap(b) и swap(a, b) должны заменять содержимое a и b, а для всех стандартных контейнеров, кроме array, оба должны иметь постоянное время.Это фактически означает, что обмен картами не может включать копирование всех элементов карты.

4 голосов
/ 22 сентября 2011

Если это не появилось в профилировщике как узкое место, возможно, вы преждевременно оптимизируете.

Мой компилятор std::map::swap() имеет следующий комментарий, который указывает, что своп карты, вероятно, будет очень быстрым:

  /**
   *  This exchanges the elements between two maps in constant
   *  time.  (It is only swapping a pointer, an integer, and an
   *  instance of the @c Compare type (which itself is often
   *  stateless and empty), so it should be quite fast.)  Note
   *  that the global std::swap() function is specialized such
   *  that std::swap(m1,m2) will feed to this function.
   */

(g++ 4.4.5)

...