#include <list>
using std::list;
int main()
{
list <int> n;
n.Push_back(1);
n.Push_back(2);
n.Push_back(3);
list <int>::iterator iter = n.begin();
std::advance(iter, n.size() - 1); //iter is set to last element
}
existe-t-il un autre moyen d'avoir un iter jusqu'au dernier élément de la liste?
Oui, vous pouvez revenir en arrière depuis la fin. (En supposant que vous sachez que la liste n'est pas vide.)
std::list<int>::iterator i = n.end();
--i;
L'un des éléments suivants renverra un std::list<int>::iterator
au dernier élément du list
:
std::list<int>::iterator iter = n.end();
--iter;
std::list<int>::iterator iter = n.end();
std::advance(iter, -1);
// C++11
std::list<int>::iterator iter = std::next(n.end(), -1);
// C++11
std::list<int>::iterator iter = std::prev(n.end());
Ce qui suit renverra un std::list<int>::reverse_iterator
au dernier élément du list
:
std::list<int>::reverse_iterator iter = std::list::rbegin();
Avec les itérateurs inversés:
iter = (++n.rbegin()).base()
En remarque: cette méthode ou Charles Bailey ont une complexité constante tandis que std::advance(iter, n.size() - 1);
a une complexité linéaire avec list [car elle a des itérateurs bidirectionnels].
Prenez la end()
et allez en arrière.
list <int>::iterator iter = n.end();
cout << *(--iter);
std::list<int>::iterator iter = --n.end();
cout << *iter;
Vous pouvez écrire vos propres fonctions pour obtenir un itérateur précédent (et suivant) à partir de celui donné (que j'ai utilisé lorsque j'ai eu besoin de "look-behind" et "look-ahead" avec un std::list
):
template <class Iter>
Iter previous(Iter it)
{
return --it;
}
Et alors:
std::list<X>::iterator last = previous(li.end());
BTW, cela pourrait également être disponible dans la bibliothèque de boost ( suivant et précédent ).
list<int>n;
list<int>::reverse_iterator it;
int j;
for(j=1,it=n.rbegin();j<2;j++,it++)
cout<<*it;