Преобразование целого числа в итератор для std :: list - PullRequest
0 голосов
/ 28 апреля 2020

У меня есть простой код ниже:

#include <iostream>
#include <list>
#include <iterator>
using namespace std;

int main()
{
    list<int> ints = { 3, 6, 1, 5, 8 };
    int index;

    index = 2;
    std::list<int>::iterator it = ints.begin() + index;
    cout << "Element at index " << index << " is " << *it << '\n';

    return 0;
}

При компиляции , он говорит:

ошибка: нет соответствия для оператора + (операнд типы: 'std :: __ cxx11 :: list :: iterator' {aka 'std :: _ List_iterator'} и 'int')
std :: list :: iterator it = ints.begin () + index;
~~~~~~~~~~~~~ ^ ~~~~~~

Я понимаю, что пытается сказать компилятор, но я не уверен, как его решить , Как мне преобразовать int в iterator и получить элемент по этому индексу? Я искал похожие вопросы, но большинство из них ищут конверсию в противоположном направлении, что можно сделать с помощью std::distance, а остальные были для разных контейнеров.

Спасибо за ваш помощь!

Ответы [ 2 ]

3 голосов
/ 28 апреля 2020

Используйте std::next.

Если вы думаете о distance как операторе - между двумя итераторами, тогда next, prev и advance равны +, - и += между итератором и целым числом.
Эти функции предназначены для одинакового обращения со всеми итераторами, даже если сложность операций различна для разных итераторов. Для std::list, который использует «прямые итераторы», все они являются линейными. Для std::vector, который использует «итераторы с произвольным доступом», все они являются постоянными.

1 голос
/ 28 апреля 2020

Преобразование целого числа в итератор для std :: list

Целые числа и итераторы - это совершенно разные понятия, поэтому неясно, какое значение имело бы такое преобразование. Как преобразовать кокос в транзитивность?

... и получить элемент с этим индексом?

Теперь, это имеет немного больше смысла. Элемент списка, однако, не имеет индексов. Но, вероятно, под индексом i вы подразумеваете i-й (начиная с нуля) последовательный элемент с начала.

В стандартной библиотеке для этого есть функция: std::next. То, что это делает (с итераторами без произвольного доступа), увеличивает интератор для заданного числа повторений в al oop. Интуитивно понятно, что асимптотика c сложность такой операции линейна.

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