Что говорит стандарт о том, как определение четкости вектора меняет емкость?

Этот веб-сайт подразумевает, что очистка вектора МОЖЕТ изменить емкость:

http://en.cppreference.com/w/cpp/container/vector/clear

Многие реализации не будут освобождать выделенную память после вызова clear (), фактически оставляя значение () вектора неизменным.

Но, согласно @JamesKanze, это неверно, и стандартные мандаты, которые ясно, не изменят емкость.

Что говорит стандарт?

В зависимости от версии стандарта, который вы просматриваете, clear определяется как эквивалент erase(begin(), end()) или (в C ++ 11):
«Уничтожает все элементы в a. Invalidates все ссылки, указатели и iteratorы, ссылающиеся на элементы a и могут аннулировать iterator прошедшего конца».

В любом случае не разрешается изменять мощность; следующий код гарантируется безопасным по стандарту:

 std::vector v; for (int i = 0; i != 5; ++ i) { v.push_back(i); } assert(v.capacity() >= 5); v.clear(); assert(v.capacity() >= 5); v.push_back(10); v.push_back(11); std::vector::iterator i = v.begin() + 1; v.push_back(12); v.push_back(13); *i = 42; // i must still be valid, because none of // the push_back would have required an // increase of capacity 

(Причина изменения формулировки на C ++ 11: комитет не хотел требовать MoveAssignable для clear , что было бы, если бы оно было определено с точки зрения erase .)

  • При использовании заголовков C в C ++ следует ли использовать функции из std :: или глобального пространства имен?
  • Вычисления без последствий (ака последовательности)
  • «Создание» объекта с возможностью копирования с возможностью memcpy
  • Псевдонимы T * с char * разрешены. Разрешено ли это другим способом?
  • Является ли stl-вектор одновременным чтением streamобезопасным?
  • Возьмите адрес элемента массива «один конец прошлого» через индекс: легальный по стандарту C ++ или нет?
  • Имеет ли printf ("% x", 1) неопределенное поведение?
  • В C ++ 11, имеет ли `i + = ++ i + 1` неопределенное поведение?
  • Включает ли инициализация преобразование lvalue-to-rvalue? Является ли `int x = x;` UB?
  • Давайте будем гением компьютера.