Это все хорошо известно. Стандартный трюк из учебника для освобождения содержимого вектора:
std::vector<int> v;
// Do stuff with v
std::vector<int>().swap(v); // clears v
Обратите внимание, что обратное не работает:
v.swap(std::vector<int>()); // compile time error
потому что вы пытаетесь привязать временную ссылку к неконстантной ссылке, что запрещено.
Visual Studio допускает это как нестандартное расширение, но повышение уровня предупреждений до / W3 (IIRC) вызывает предупреждение "используется нестандартное расширение".
В C ++ 11 (и технически в C ++ 03 тоже!) Вы можете просто сделать
v = std::vector<int>();
или, если вы многословны (только C ++ 11), есть
v.clear(); // or v.resize(0);
v.shrink_to_fit();
но стандарт ничего не гарантирует о том, будет ли выполнен запрос на сокращение.
Вы можете использовать это, если вам действительно нужно, но, пожалуйста, не наследуйте от стандартных контейнеров . Это небезопасно: вы рискуете вызвать не тот деструктор.