Итак, вот различия, и я позволю вам решить, что лучше для вашей ситуации.
v.clear();
v.resize(3, 1);
В этом случае мы пометили вектор как очищенный.Он по-прежнему содержит все, что было выделено для хранения 100 элементов (что может быть больше, чем пространство, необходимое для 100 элементов).Затем мы добавили 3 элемента со значением 1. Все, что они сделали, это увеличили счетчик размера и сбросили 3 значения, основная память все еще остается той же самой.создается дополнительный временный вектор, и вместо периодических мест, где счетчик равен 0, а затем 3 с некоторыми значениями, он просто копирует размер счетчика, а затем выполняет операцию, аналогичную memcpy, для копирования трех элементов.Размер основной памяти, выделенной для v, все еще достаточен для хранения 100 целых чисел.
vector<int>(3, 1).swap(v);
Этот показатель существенно отличается.В этом случае мы создаем временный вектор, который содержит 3 элемента, все из которых инициализированы в 1. Теоретически у него все еще может быть достаточно памяти, зарезервированной для 100 элементов, но есть вероятность, что он имеет гораздо меньше.Затем мы меняем этот вектор своим собственным и позволяем временному уничтожаться.Это дает дополнительное преимущество очистки любой дополнительной памяти, выделенной нашим старым вектором, который не был во временном.Это работает так, что два вектора (наш v и временный) меняют местами не только счетчики и значения, они также меняют указатели буфера.
Это единственный способ уменьшить вектор.