No estoy seguro de lo que está mal con este código:¿Por qué la llamada a std :: vector :: volver() estrellarse mi programa
std::vector<int> myVector(0);
if (myVector.back() == 12)
myVector.push_back(12);
Parece que volver a llamar() en un vector vacío se bloquea la programa.
No entiendo por qué está fallando? ¿Necesitamos verificar la longitud del vector antes de llamar al back()
? o es posible que sea un error?
La documentación dice que, si el vector está vacío, devuelve un valor indefinido.
Sospecho que equivale a que alguien te dé -1 por usar MSDN como referencia en lugar del estándar de C++. Los implementadores pueden definir mejor lo que hace su implementación en casos que el estándar dice que son UB, por lo que si MS quiere garantizar que 'back()' regresará cuando se use en un vector vacío, tienen derecho a hacerlo. Si está utilizando MSVC++, tiene derecho a leer su documentación. Pero podría ser -1 por no darse cuenta de que el uso de un "valor indefinido" de cualquier manera, puede causar un bloqueo. –
@SteveJessop Creo que MSDN es la implementación del estándar C++. Pero me parece raro que llamar a un método en un elemento válido (hasta donde sé que un vector vacío es un elemento válido) interrumpe mi programa. Bueno, si el estándar lo dice, que así sea :) – MBen
MSVC++ es * una * implementación de (aproximadamente) el estándar C++. Otras implementaciones se comportan de manera diferente, si el estándar no establece el comportamiento. La razón por la que el estándar no define la invocación 'back()' en un vector vacío es para que las implementaciones no necesiten un código de caso especial para él. Por lo tanto, pueden elegir ser más rápidos de lo que serían si tuvieran que verificar si el vector estaba vacío o no, y hacer cosas diferentes en casos diferentes. Serán propensos a bloquearse (o empeorar) cuando haces algo mal. Puede parecer extraño, pero es una compensación hecha como parte del diseño del lenguaje. –