2012-06-15 3 views
3

Итератор «.end()» для всех экземпляров данного контейнера STL указывает на один и тот же объект «мимо конца»?C++: STL использует универсальное значение «end()» для итератора?

например.

std::set<int> my_set_1; 
// fill "my_set_1" 
std::set<int> my_set_2; 
// fill "my_set_2" 

bool same_end_iterator =  my_set_1.end() == my_set_2.end() ; 

Является ли последняя линия зависимой от реализации?

ответ

4

Понятно, что есть один сквозной итератор на контейнер и сравнение итераторов в разных контейнерах, даже те же, что и UB.

В самом деле, для старых школьных массивов, то вне-конец итератор a+N где a является основой массива и N является количество элементов в нем, что означает разные итераторы вне-конец для различных массивы. Это также самая разумная реализация для std::vector::iterator, о которой я могу думать.

+0

Это правильная концепция для «старых школьных массивов», но не обязательно для контейнеров STL. Хотя это может быть привлекательно для нашей интуиции использовать «сквозную» метафору, нет никаких указаний на то, что это реальность для контейнеров STL (особенно за пределами 'vector'.) – cmo

+0

@CycoMatto: я обратился к общему случаю в моем первое предложение. В контейнере есть один сквозной итератор; реализация может использовать одно и то же значение для всех контейнеров определенного типа, но вы не можете полагаться на это. –

10

Итератор «.end()» для всех экземпляров данного контейнера STL указывает на тот же объект «прошлый-конец»?

Нет, стандарт не дает никаких гарантий, и на практике некоторые типы контейнеров, вероятно, не будут работать так. Например, std::vector::iterator обычно реализуется как указатель на элемент массива, а end() указывает на конец массива.

Является ли последняя линия зависимой от реализации?

Последняя строка дает неопределенное поведение. Вы не можете сравнивать итераторы из разных коллекций, включая итераторы конца прошлого.

+0

Но мой вопрос касался итератора «.end()». Поэтому ваш ответ в основном таков: «Нет, потому что это неверно», что бесполезно. – cmo

+0

@CycoMatto: Ответ Майка охватывает общий случай, из которого немедленно следует случай 'end()'. –

+0

@CycoMatto: Извините, если мой ответ был слишком кратким для вас. Я немного скорректировал его, чтобы ответить на ваш вопрос. –

1

К моему знанию, сравнение итераторов, принадлежащих разным контейнерам, не определено, я не помню, какой. Это скорее подразумевает, что данный std::vector<int> foo, bar, foo.end() - это не то же самое, что и bar.end().

Смежные вопросы