vector<int> input = {1, 2, 3, 4, 17, 117, 517, 997};
cout<< "input vector at index -1 is: " << input[-1] <<endl;

Usando el código anterior, el resultado será: la entrada en el índice -1 es: 0. Sin embargo, si usamos lo siguiente:

vector<int> input = {1, 2, 3, 4, 17, 117, 517, 997};
cout<< "input vector at index -1 is: " << input.at(-1) <<endl;

El resultado sería: la entrada en el índice -1 es: libc ++ abi.dylib: terminando con una excepción no detectada del tipo std :: out_of_range: vector.

¿Alguien puede explicarme la razón? Gracias.

3
Feng 15 dic. 2016 a las 08:35

2 respuestas

La mejor respuesta

El miembro at realiza comprobaciones de rango y responde adecuadamente.

El operator [] no lo hace. Este es un comportamiento indefinido y un error en su código.

Esto se indica explícitamente en los documentos.

9
Captain Giraffe 15 dic. 2016 a las 05:38

El primero es el comportamiento indefinido. Cualquier cosa podría pasar. No tiene permitido quejarse, pase lo que pase.

El segundo, se lanza una excepción y no la detecta, por lo que se llama a std::terminate() y su programa muere. El fin.

3
John Zwinck 15 dic. 2016 a las 05:39