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 ==
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()
yback()
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
asize()-1
consize()-1
siendo el último. Por lo tanto, el penúltimo essize()-2
.– Ben Voigt
27 de junio de 2014 a las 14:34
Puedes intentar hacer esto: –
if(*(arr2.rbegin()+1))
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;
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.
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)
oarr2[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