Могу ли я инициализировать итератор с нуля, и если нет, то почему? - PullRequest
3 голосов
/ 31 января 2020

Я пытаюсь инициализировать итератор для NULL, но он не работает. Кто-нибудь может мне помочь?

Если указатель может быть инициализирован нулем, почему мы не можем сделать это для итератора?

vector<int> bob;
vector<int>::iterator it=NULL;

Я хочу инициализировать итератор в конструкторе класса так что во время создания объекта класса итератор должен быть установлен на NULL (по умолчанию).

Ответы [ 2 ]

2 голосов
/ 31 января 2020

Наилучшим эквивалентом для NULL или null_ptr для итератора является значение container::end(). Это также не указывает на допустимый элемент контейнера. Таким образом, вместо тестирования предиката (i == null_ptr), тестирования (i == v.end()) и инициализации как auto i = v.end();.

Вы не можете инициализировать итератор, пока не получите контейнер. Но на практике это не проблема, потому что итератор не имеет смысла без контейнера, на который он ссылается.

Если у вас сложный код, который использует итераторы, и вы хотите изолировать этот код в функции, у вас будет передать в функцию два итератора: текущий или начальный итератор и конечный итератор. Это то, что делает STL.

2 голосов
/ 31 января 2020

Нет, в общем случае вы не можете инициализировать итератор с NULL. Требования итератора не требуют, чтобы итератор был назначаемым или инициализируемым из целочисленного типа или std::nullptr_t, возможных типов, которые может иметь NULL.

Нет смысла пытаться это сделать. Это просто не нужно. Но так как вы не объяснили, почему вы пытаетесь это сделать, я не могу вносить дальнейшие предложения.


По поводу ваших дополнительных вопросов в комментариях: Вы можете value-initialize каждый прямой итератор :

vector<int>::iterator it{}; // value-initialized

Начиная с C ++ 14 вы гарантируете, что сравниваемые итераторы одного типа, построенные таким образом, будут сравниваться равными.

Все контейнерные итераторы являются прямыми итераторами.

...