Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > проход списка list не с начала


Автор: ksili 5.3.2009, 08:56
Есть список std::list. Иногда надо обходить его итератором не с начала, а допустим с 3-го элемента. Как это реализовать?
Пока придумал так:
Код

int i = 0;
for (list<Rule>::iterator it = alist.begin(); it != alist.end(); it++)
        {
            i++;
                 if (i > 3)
            {
                .......
            }
        }

Но может есть и какая-то встроенная в STL возможность сделать это? Что-нибудь типа 
Код

for (list<Rule>::iterator it = alist.begin() + 3; it != alist.end(); it++)

или
Код

for (list<Rule>::iterator it = alist[3]; it != alist.end(); it++)

Автор: Lazin 5.3.2009, 09:03
Цитата(ksili @  5.3.2009,  08:56 Найти цитируемый пост)
for (list<Rule>::iterator it = alist.begin() + 3; it != alist.end(); it++)

если-бы у листа был RandomAccessIterator, то это прокатило-бы, может использовать deque?

Добавлено через 1 минуту и 8 секунд
конечно-же тут не хватает проверки размера контейнера, так-как если в alist меньше 3х элементов, то...

Автор: vinter 5.3.2009, 09:39
Код

std::list<Rule>::iterator it = alist.begin();
std::advance(it, 3);
for ( ; it != alist.end(); it++)
...

Автор: ksili 5.3.2009, 09:56
vinter, спасибо.

Можно ли это как-то использовать и для обрезания с конца? т.е. чтобы проходить список не до последнего элемента?

Добавлено через 10 минут и 26 секунд
Цитата(ksili @  5.3.2009,  13:56 Найти цитируемый пост)
Можно ли это как-то использовать и для обрезания с конца? т.е. чтобы проходить список не до последнего элемента?

кажись так можно:
Код

    list<Rule>::iterator it = alist.begin();
    list<Rule>::iterator it2 = alist.end();
    std::advance(it2, -3);

    for (; it != it2; it++)
        {
        ....
        }

Автор: vinter 5.3.2009, 10:14
Цитата(ksili @  5.3.2009,  10:56 Найти цитируемый пост)
кажись так можно:

угу, для Random и Bidirectional

Автор: bsa 10.3.2009, 17:18

M
bsa
ksili, если ответ на вопрос получен, то пометь тему решенной

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)