Перемещение вектора с копией самого себя

При чтении кода я вижу, что:

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

Мой вопрос

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

Ответ 1

Это шаблон для усадки для соответствия в С++ 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

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

Ответ 2

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

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

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