¿Cómo encontrar el penúltimo elemento en un vector en C++?

3 minutos de lectura

Avatar de usuario de la persona
Persona

Estoy tratando de construir un programa que use el penúltimo elemento en un vector, hasta ahora he usado:

(arr2.rbegin()+1)

Si uso un operador de comparación en un condicional como:

if(arr2.rbegin()+1 == true) 

Recibo un mensaje de error: no match for operator ==

  • arr2.rbegin()+1 es un iterador, no un valor. Intenta usar *: if (*(arr2.rbegin()+1) == true)

    – JoshG79

    30 de agosto de 2013 a las 19:11

  • *(arr2.rbegin()+1) o arr2[arr2.size()-2]

    – Dave

    30 de agosto de 2013 a las 19:11


  • @JoshG79: en ese caso, el tipo que obtiene al eliminar la referencia del iterador también debe definir un operador == apropiado.

    – tokra

    30 de agosto de 2013 a las 19:13


Avatar de usuario de Ben Voigt
ben voigt

Muchas de las respuestas y comentarios tienen la idea correcta pero una sintaxis realmente fea. Aquí hay dos buenas maneras de expresar eso.

arr2.end()[-2] // end() is past the last element, -1 for last element, -2 for second-last
arr2.rbegin()[1] // rbegin() is reverse order starting at 0 for last element, 1 for second-last

Manifestación: http://ideone.com/2cZeUq

Funciona porque RandomAccessIterator, que vector tiene, está obligado a proporcionar operator[] tal que it[n] es equivalente a *(it + n)al igual que para los punteros.

Entonces el código en tu pregunta se convierte en solo

if (arr2.rbegin()[1]) // test penultimate element

  • @Federico: no, front() y back() dar referencias, no iteradores. La aritmética de punteros no funciona en las referencias. Podrías hacerlo (&arr2.back())[-1] pero eso es más feo que usar los iteradores.

    – Ben Voigt

    18 de abril de 2016 a las 0:35

  • ¡Gracias por la explicación! 🙂

    – Federico

    18 de abril de 2016 a las 6:28

  • Siempre olvidé que el vector tiene un iterador de acceso aleatorio …

    – Nick

    21 de junio de 2020 a las 18:11

mirando la documentación aquí

http://www.cplusplus.com/reference/vector/vector/?kw=vector

Espero que acceda a su elemento por

secondToLast = myVector[myVector.size() - 2];

  • ¿No debería ser menos 1 en lugar de menos 2, ya que los índices se basan en cero?

    – Damon

    30 de agosto de 2013 a las 22:22

  • @Damon: No, no debería. Los índices van desde 0 a size()-1con size()-1 siendo el último. Por lo tanto, el penúltimo es size()-2.

    – Ben Voigt

    27 de junio de 2014 a las 14:34

Puedes intentar hacer esto: –

if(*(arr2.rbegin()+1))

avatar de usuario de tzg
tzg

A veces puede haber menos de 2 elementos en la lista, por lo que myVector.size() – 2 u otros accesos directos generarán un error. He hecho lo siguiente. . .

if (myVector.size() > 1)
{
    secondToLast = myVector[myVector.size() - 2];
}

Depende de lo que entiendas por “penúltimo elemento”. Tome la siguiente definición de iterador…

vector<int>::iterator it = arr2.end();

it--; 
it--;

Tienes que desacreditar el iterador dos veces porque cuando declaras que el iterador “apunta” al final, en realidad hace referencia a la ubicación DESPUÉS del último elemento en el vector.

No olvide que cuando desee el valor al que apunta el iterador, debe desreferenciarlo. al igual que…

cout << *it;

Avatar de usuario de jber Ibra
jber ibrá

Hay muchas formas de acceder a los elementos desde atrás, una que puede usar es la propiedad trasera que viene con el contenedor std::vector y si desea acceder a un elemento desde atrás (ya sea el último elemento o hasta n) puede hacerlo este

std::vector vec{1,2,3}; int últimosegundo = vec.back()-1; te dará -> 2;

puede verificar las propiedades del vector que hay un poco decente.

https://en.cppreference.com/w/cpp/container/vector

¿Ha sido útil esta solución?