c++ vector language-lawyer

c++ - ¿Qué dice la norma acerca de cómo llamar claramente a un vector cambia la capacidad?



language-lawyer (1)

Dependiendo de la versión del estándar que esté viendo, clear se define como el equivalente a erase(begin(), end()) o (en C ++ 11):
"Destruye todos los elementos en a. Invalida todas las referencias, punteros e iteradores que hacen referencia a los elementos de a y puede invalidar el iterador pasado-al-fin".

En ninguno de los casos, se permite modificar la capacidad; el siguiente código está garantizado seguro por el estándar:

std::vector<int> 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<int>::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

(El motivo del cambio en la redacción en C ++ 11: el comité no quería exigir MoveAssignable para clear , que habría sido el caso si se definiera en términos de erase ).

Este sitio web implica que borrar un vector PUEDE cambiar la capacidad:

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

Muchas implementaciones no liberarán la memoria asignada después de una llamada a clear (), dejando efectivamente la capacidad () del vector sin cambios.

Pero de acuerdo con @JamesKanze, esto es incorrecto y el estándar exige que eso no cambie la capacidad.

¿Qué dice el estándar?