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?