2014-02-01 4 views
2

Какой способ лучше/быстрее в C++ 11, чтобы очистить контейнер (например, очереди):C++ 11 очистка контейнера с станд :: своп против оператора = (T &&)

void clean() 
{ 
    std::queue<int> empty_q; 
    std::swap(q_to_clear, empty_q); 
} 

или с помощью оператор = (Q & &) (быстрее, чем своп?)

void clean() 
{ 
    q_to_clear = std::queue<int>{}; 
} 

Или это по существу то же самое?

ответ

4

Это, вероятно, практически не имеет значения, но для назначения переходов требуется, чтобы временная очередь источника должна была создать новое пустое состояние после того, как оно было перемещено, из которого вы можете избежать при замене. И вы можете написать обменивать следующим образом:

std::queue<int>().swap(q_to_clear); 
2

C++11 -ness повышен до крайности:

decltype(q_to_clear)().swap(q_to_clear); 

работает на других std:: контейнеры тоже.

и компактная память синтаксиса так круто, как:

decltype(q_to_compact)(q_to_compact).swap(q_to_compact); 
+0

Что такое использование * компактной память * версии? ... ах, вы делаете копию 'q_to_compact'. Будет ли '{}' сделать это более понятным или вы боитесь проблем с списком инициализаторов? – Yakk

+0

@Yakk - это освобождение избыточной памяти. Политика распределения по умолчанию для 'std :: vector' заключается в том, чтобы увеличить емкость на x2, когда она исчерпана, поэтому в итоге может быть потеряна половина памяти. Таким образом, вы создаете временный вектор из существующего (этот вектор будет иметь емкость, точно соответствующую размеру), swap - это кишка с вектором, который вы хотите сжать, и позволить ему выйти из области видимости. – bobah

Смежные вопросы