Как начать перебор std::list с N-го элемента?

197
30 декабря 2021, 11:10

Есть два алгоритма перебора листа:

for (auto iter = numbers.begin(); iter != numbers.end(); iter++){
        std::cout << *iter << "\t";
    }

И

for (int n : numbers) std::cout << n << "\t";

Оба этих алгоритма перечисляют элементы с 1го по последний.

А если нужно перечислить с Nго по последний?

Есть возможность в данном примере использовать нечто типа

size_t pos = 0;
for (auto iter = numbers.begin(); iter != numbers.end(); iter++){
       if (pos++ > N) std::cout << *iter << "\t";
}

Здесь я считал элементы с нуля.

Однако данный метод я нахожу костыльным, т.к.:

  • Мы перебираем все элементы
  • Доп. действия сравнения, а это время
  • Такой код перестает быть легко читабельным

Есть ли более правильное решение данного вопроса?

Спасибо!

Answer 1

Функция std::next, примененная к итератору, позволит вам найти любой элемент контейнера.

for (auto iter = std::next(numbers.begin(), n); iter != numbers.end(); ++iter)

Однако применение функции std::next (как и функции std::advance) с большим и/или неконстантным вторым параметром является "красным флагом" в коде. Именно потому, что вы все равно будете так или иначе перебирать все элементы. Если вы занимаетесь подобным двиганием итератора, не поддерживающего произвольный доступ (т.е. обычный оператор +), то возможно вы делаете что-то неправильно. В большинстве случаев вы должны относиться к такому применению std::next/std::advance как к временному "костылю" в коде.

Answer 2

Ну, по списку все равно придется идти по порядку...

Но в общем случае это делается примерно так:

auto iter = numbers.begin();
advance(it,N);
for (;iter != numbers.end(); iter++){
    ....
}

или

for (auto iter = next(numbers.begin(),N); iter != numbers.end(); iter++){
    ....
}

При этом, если контейнер позволяет переходить быстро - переход действительно будет быстрым...

Answer 3

Пример инкремента итератора на 2 позиции.

std::list<int>::iterator it=mylist.begin();
std::advance(it, 2);
READ ALSO
Как используя QFileDialog загрузить в массивы численные данные в Qt Creator

Как используя QFileDialog загрузить в массивы численные данные в Qt Creator

Создал диалоговое окно для выбора файлаtxt

158
Поиск в бинарном дереве

Поиск в бинарном дереве

Нужно проверить есть ли элемент Х в бинарном деревеМоя функция Find работает рандомно, то находит то не находит (хотя он есть)

110
Unreal Engine 4 не видит Visual Studio 2019

Unreal Engine 4 не видит Visual Studio 2019

Можно ли его как то указать в настройках движка (как в Unity)?

199