Почему итератор set :: end в C ++ разыменовывает количество элементов в наборе? - PullRequest
3 голосов
/ 03 марта 2020

В C ++ - STL set :: end () возвращает итератор, указывающий на элемент last-the-last контейнера set. Поскольку он не ссылается на действительный элемент, он не может разыменованной функцией end () вернуть двунаправленный итератор.

Но когда я выполняю следующий код:

set<int> s;

s.insert(1);
s.insert(4);
s.insert(2);

// iterator pointing to the end
auto pos2 = s.end();
cout<<*pos2;

, он печатает 3 как вывод. Вывод увеличивается, когда я вставляю больше элементов в набор и всегда равен общему количеству элементов в наборе.

Почему это происходит?

Ответы [ 3 ]

6 голосов
/ 03 марта 2020

Разыменование итератора end() является неопределенным поведением, поэтому все может произойти. В идеале вы должны получить cra sh, но, к сожалению, здесь это не так, и кажется, что все работает.

2 голосов
/ 03 марта 2020

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

std::set::size() имеет сложность O (1), но std::set является контейнером на основе узлов (внутренне двоичное дерево поиска). Таким образом, размер должен храниться где-то в структуре данных. Возможно, итератор end() указывает на место, которое удваивается как хранилище для размера, и по чистой случайности вы можете получить к нему доступ.

2 голосов
/ 03 марта 2020

Поскольку он не ссылается на действительный элемент, он не может разыменовать

Может, как показал ваш тестовый код. Однако, это не должно быть разыменованным.

...