Это шаблон для усадки для соответствия в С++ 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) создает копию вектора, зарезервированный размер которого может быть меньше оригинала.
Таким образом, замена вектора со свежей копией может быть способом освобождения некоторой нежелательной памяти.