c++ - node - single linked list
Accediendo al Ășltimo nodo en std:: list (3)
P: He intentado "if (pointList.back ())" en su lugar, pero eso me da un error de "no operador coincide con estos operandos".
El problema con este enfoque es que necesita comparar el iterador con el último elemento, y no solo verificar si el último elemento de la lista es cero o no.
El mejor enfoque sería verificar si el iterador apunta al "extremo -1" de la siguiente manera:
else if (next(i) == pointList.end())
Tenga en cuenta que std::next
solo se introdujo en C ++ 11, por lo que sin soporte para eso, tendría que crear la semántica usted mismo o simplemente usar boost::next
.
Intento escribir un código que vaya a través de una lista de ''pointNodes'' e imprimir la variable x del nodo actual, anterior y siguiente para cada uno; espere los primeros y últimos nodos de la lista, que usan el último nodo en lugar del anterior y el primer nodo en lugar del anterior, respectivamente.
Aquí está el código que imprime la lista:
n = 1;
p = 1;
for (i = pointList.begin(); i != pointList.end(); ++i)
{
if (i == pointList.begin()) // for the first node, works fine
{
cout << "First node! x is " << i->getX() << ", next X var is " << next(point, n)->getX() << ", previous X is " << pointList.begin()->getX() << " (n is(" << n << "), p is(" << p << ")" << endl;
n = n + 1;
p = p - 1;
}
else if (i == pointList.end()) // problem bit
{
cout << "Last node! x is " << i->getX() << ", next X var is " << pointList.begin()->getX() << ", previous X is " << prev(point, p)->getX() << " (n is(" << n << "), p is(" << p << ")" << endl;
n = n + 1;
p = p - 1;
}
else // for everything inbetween, works fine.
{
cout << "x is " << i->getX() << ", next X var is " << next(point, n)->getX() << ", previous X is " << prev(point, p)->getX() << " (n is(" << n << "), p is(" << p << ")" << endl;
n = n + 1;
p = p - 1;
}
}
Me doy cuenta de que list.end en realidad no significa el último nodo en la lista. Todavía no estoy seguro de cómo hacer algo diferente para ese último nodo, así que agradecería cualquier ayuda. He intentado "if (pointList.back ())" en su lugar, pero eso me da un error de "no operador coincide con estos operandos".
¡Gracias!
Creo que su solución más limpia comprueba que hay más de dos elementos y luego simplemente itera sobre el rango de begin+1
hasta el end-1
:
// check size, otherwise increment/decrement might be invalid
if (list.size() < 2) return;
for(it = std::next(container.begin()), end = std::prev(container.end()); it!=end; ++it)
{
prev = std::prev(it);
next = std::next(it);
// output prev, it, next here
}
Dado que su lista contiene suficientes elementos, podría ser un comienzo para arreglar la segunda condición para probar el último elemento válido , es decir, el anterior al end()
:
else if (std::next(i) == pointList.end()) // fixed problem bit