Какой лучший способ очистить контейнер в C++?

Какой самый лучший, самый быстрый и самый надежный способ очистки std::list а также std::set?

// 1st
list.clear();
set.clear();

// 2nd
list = {};
set = {};

// 3rd
list.swap(std::list<some_type>{});
set.swap(std::set<some_type>{});

2 ответа

Все эти параметры будут примерно одинаковой производительности (с clear версия, требующая чуть меньше операций, чем две другие, хотя снижение производительности, скорее всего, не поддается количественной оценке), но версия (1) из container.clear является наиболее понятным (с точки зрения читабельности кода) из всех, так что я бы пошел с этим.

Стоит отметить, что list.swap(std::list<some_type>{}); это ошибка компиляции, так как std::list::swap не имеет перегрузки для ссылки на rvalue и принимает только неконстантные ссылки на lvalue. То же самое для std::set::swap, Вам нужно будет создать именованный временный объект и поменять его местами.

Все три одинаково "надежны".

Версия с .clear() очевидно, самый ясный.:)

Серьезно, однако, используйте функцию, которая названа для задачи, и которая была специально добавлена ​​для задачи. Здесь нет нужды в тайных "хитростях". Напишите самодокументированный код.

Другие вопросы по тегам