Обмен вектора с копией себя - PullRequest
10 голосов
/ 21 февраля 2012

Читая код, я вижу, что:

vector<TypeA>(typeAObj).swap(typeAObj);

У меня вопрос

Почему они меняют вектор на собственную копию?

Ответы [ 2 ]

12 голосов
/ 21 февраля 2012

Это шаблон для сжимаемого до соответствия в C ++ 03, где нет такой операции в интерфейсе векторного класса.Код создает копию (возможно, capacity вектора будет близок к числу доступных элементов), а затем заменяет ее исходным вектором.После завершения выражения временный (который теперь содержит исходные буферы) отбрасывается, а память освобождается.

Рассмотрим:

std::vector<int> large;
large.reserve( 10000000 );  // might be the result of multiple push_back/erase
// large.capacity() >= 10000000
large.push_back( 1 );       // Make more explicit that 'large' might not be empty
std::vector<int>( large ).swap( large ); 
// large.capacity() is hopefully closer to 1

В C ++ 11 тип вектора былизменен, чтобы обеспечить shrink_to_fit операцию, которая берет на себя эту роль.Важно отметить, что ни старый шаблон, ни shrink_to_fit не являются операциями связывания, то есть нет гарантии на capacity вектора после операции, отличной от capacity() >= size().

8 голосов
/ 21 февраля 2012

Я считаю, что это способ «уменьшить» вектор до минимального размера.

vector<TypeA>(typeAObj) создает копию вектора, зарезервированный размер которого может быть меньше оригинала.

Таким образом, замена вектора свежей копией может стать способом освобождения некоторой нежелательной памяти.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...