Итератор до последнего элемента в std :: list - PullRequest
49 голосов
/ 20 апреля 2010
#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
}

есть ли какой-нибудь другой способ добавить иттер к последнему элементу в списке?

Ответы [ 7 ]

88 голосов
/ 20 апреля 2010

Да, вы можете вернуться назад с конца. (Предполагая, что вы знаете , что список не пустой.)

std::list<int>::iterator i = n.end();
--i;
55 голосов
/ 20 апреля 2010

Любое из следующего вернет std::list<int>::iterator к последнему элементу в 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());

Следующий код вернет std::list<int>::reverse_iterator к последнему элементу в list:

std::list<int>::reverse_iterator iter = std::list::rbegin();
9 голосов
/ 21 апреля 2010

с обратными итераторами:

iter = (++n.rbegin()).base()

В качестве примечания: этот метод или метод Чарльза Бейли имеют постоянную сложность, в то время как std::advance(iter, n.size() - 1); имеет линейную сложность со списком [поскольку он имеет двунаправленные итераторы].

6 голосов
/ 20 апреля 2010

Возьмите end() и идите назад.

list <int>::iterator iter = n.end();
cout << *(--iter);
5 голосов
/ 07 января 2013
std::list<int>::iterator iter = --n.end();
cout << *iter;
1 голос
/ 21 ноября 2012
list<int>n;
list<int>::reverse_iterator it;
int j;

for(j=1,it=n.rbegin();j<2;j++,it++)
cout<<*it;
1 голос
/ 21 апреля 2010

Вы можете написать свои собственные функции, чтобы получить предыдущий (и следующий) итератор из заданного (который я использовал, когда мне нужно было «смотреть назад» и «смотреть вперед» с std::list):

template <class Iter>
Iter previous(Iter it)
{
    return --it;
}

А потом:

std::list<X>::iterator last = previous(li.end());

Кстати, это также может быть доступно в библиотеке повышения ( следующий и предыдущий ).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...