Какой самый быстрый способ «очистить» большой контейнер STL? В моем приложении мне нужно иметь дело с большим размером std::map
, например, 10000 элементов.
Я протестировал следующие 3 метода, чтобы очистить файл std::map
.
- Создавайте новый контейнер каждый раз, когда мне это нужно.
- Вызов метода
map::clear()
. - Вызов метода
map::swap()
.
Кажется, что ::swap()
дает лучший результат. Кто-нибудь может объяснить, почему это так, пожалуйста? Можно ли с уверенностью сказать, что использование метода map::swap()
является правильным способом «очистить» std::map? То же самое для других контейнеров STL, например, set
, vector
, list
и т. д.
m_timer_start = boost::posix_time::microsec_clock::local_time();
// test_map.clear();
test_map.swap(test_map2);
for (int i = 0; i< 30000; i++){
test_map.insert(std::pair<int, int>(i, i));
}
// std::map<int, int> test_map_new;
// for (int i = 0; i< 30000; i++){
// test_map_new.insert(std::pair<int, int>(i, i));
// }
m_timer_end = boost::posix_time::microsec_clock::local_time();
std::cout << timer_diff(m_timer_start, m_timer_end).fractional_seconds() << std::endl; // microsecond
std::swap
и как вы это оцениваете? - person David Brown   schedule 11.04.2012swap
сам по себе, безусловно, быстрее, чемclear
, но он не освобождает место. Вы уверены, что засчитали уничтожение объекта, с которым поменялись местами? - person leftaroundabout   schedule 11.04.2012std::map<int, int>().swap(test_map);
. - person ildjarn   schedule 11.04.2012map<int,int>
. Посмотрите, можете ли вы вместо этого использовать отсортированный вектор; это, безусловно, сделаетclear
быстрее. - person Potatoswatter   schedule 11.04.2012.clear()
, замена на пустую карту не идиоматична ... - person ShadowRanger   schedule 18.04.2016