Здравствуйте, anton_p, Вы писали:
_>Привет всем, _>кто нибудь может подсказать параграфы стандарта где описывается поведение при сравнение итераторов, в частности "конечных", от разных контейнеров?
А зачем их сравнивать? Да и насколько я понимаю суть итераторов, они не должны вообще сравниваться, следовательно не должно быть и оператора сравнения для них.
Re: сравнение (конечных (.end() итераторов от разных контейн
Здравствуйте, anton_p, Вы писали:
_>Привет всем, _>кто нибудь может подсказать параграфы стандарта где описывается поведение при сравнение итераторов, в частности "конечных", от разных контейнеров?
пока я склоняюсь к тому, что в стандарте 03 нет такого параграфа
в драфте нового стандарта уже что-то есть, но тоже довольно размыто
An iterator j is called reachable from an iterator i if and only if there is a finite sequence of applications of the expression ++i that makes i == j. If j is reachable from i, they refer to elements of the same sequence.
§ 24.2.5
The domain of == for forward iterators is that of iterators over the same underlying sequence.
Given that RandomAccessIterator must satisfy all requirements imposed by ForwardIterator, comparing iterators from different containers is undefined.
сравнение (конечных (.end() итераторов от разных контейнеров
Привет всем,
кто нибудь может подсказать параграфы стандарта где описывается поведение при сравнение итераторов, в частности "конечных", от разных контейнеров?
_>>кто нибудь может подсказать параграфы стандарта где описывается поведение при сравнение итераторов, в частности "конечных", от разных контейнеров?
V>А зачем их сравнивать? Да и насколько я понимаю суть итераторов, они не должны вообще сравниваться, следовательно не должно быть и оператора сравнения для них.
тип то у них у всех одинаковый. Для итераторов из одного контейнера есть оператор сравнения. Значит и для итераторов из разных контейнеров (разных объектов, а не классов) оператор есть, но пользоваться им запрещено.
Re[3]: сравнение (конечных (.end() итераторов от разных конт
_>>>кто нибудь может подсказать параграфы стандарта где описывается поведение при сравнение итераторов, в частности "конечных", от разных контейнеров?
V>>А зачем их сравнивать? Да и насколько я понимаю суть итераторов, они не должны вообще сравниваться, следовательно не должно быть и оператора сравнения для них.
D>тип то у них у всех одинаковый. Для итераторов из одного контейнера есть оператор сравнения. Значит и для итераторов из разных контейнеров (разных объектов, а не классов) оператор есть, но пользоваться им запрещено.
А какая логика могла бы быть для такого оператора сравнения для итераторов?
Вообще не понимаю — каким волшебным образом могут быть равны два итератора для разных контейнеров, даже если контейнеры одного типа . Хотя вот здесь
Здравствуйте, v2kochetov, Вы писали:
V>А зачем их сравнивать? Да и насколько я понимаю суть итераторов, они не должны вообще сравниваться, следовательно не должно быть и оператора сравнения для них.
С подобным способом обхода контейнера ни сталкивались?
Если Вам, anton_p, надо каким то образом определить что итераторы разных контейнеров указывают на один и тот же элемент, да ещё и на "элемент после последнего" — стоит задуматься, а не сбились ли Вы с пути истинного и пересмотреть способ решения задачи, м.б. прийти к общему контейнеру.
Ибо мудрите вы тут что то
Re[3]: сравнение (конечных (.end() итераторов от разных конт
Здравствуйте, _niko_, Вы писали:
__>Здравствуйте, v2kochetov, Вы писали:
V>>А зачем их сравнивать? Да и насколько я понимаю суть итераторов, они не должны вообще сравниваться, следовательно не должно быть и оператора сравнения для них.
__>С подобным способом обхода контейнера ни сталкивались? __>
Мм а где тут сравнение итераторов из разных контейнеров?
__>Если Вам, anton_p, надо каким то образом определить что итераторы разных контейнеров указывают на один и тот же элемент, да ещё и на "элемент после последнего" — стоит задуматься, а не сбились ли Вы с пути истинного и пересмотреть способ решения задачи, м.б. прийти к общему контейнеру. __>Ибо мудрите вы тут что то
Вот и я о том же.
Re[4]: сравнение (конечных (.end() итераторов от разных конт
Здравствуйте, v2kochetov, Вы писали:
V>>>А зачем их сравнивать? Да и насколько я понимаю суть итераторов, они не должны вообще сравниваться, следовательно не должно быть и оператора сравнения для них.
__>>С подобным способом обхода контейнера ни сталкивались? __>>
V>Мм а где тут сравнение итераторов из разных контейнеров?
Цитирую Ваши слова: "Да и насколько я понимаю суть итераторов, они не должны вообще сравниваться, следовательно не должно быть и оператора сравнения для них." — подвергалась сомнению необходимость сравнения итераторов одного контейнера, ну как я понял
Re: сравнение (конечных (.end() итераторов от разных контейн
Здравствуйте, anton_p, Вы писали: _>кто нибудь может подсказать параграфы стандарта где описывается поведение при сравнение итераторов, в частности "конечных", от разных контейнеров?
Для разных классов поведение "конечных" итераторов может быть разным , например:
24.5.1 Class template istream_iterator
1...
If the end of stream is reached ( operator void*() on the stream returns false), the iterator becomes equal to the end-of-stream iterator value. The constructor with no arguments istream_iterator() always constructs an end of stream input iterator object, which is the only legiti- mate iterator to be used for the end condition. The result of operator* on an end of stream is not defined. For any other iterator value a const T& is returned. The result of operator-> on an end of stream is not defined. For any other iterator value a const T* is returned. It is impossible to store things into istream iterators. The main peculiarity of the istream iterators is the fact that ++ operators are not equality preserving, that is, i == j does not guarantee at all that ++i == ++j. Every time ++ is used a new value is read.
3. Two end-of-stream iterators are always equal. An end-of-stream iterator is not equal to a non-end-of- stream iterator. Two non-end-of-stream iterators are equal when they are constructed from the same stream.
Но:
24.1.6
An iterator j is called reachable from an iterator i if and only if there is a finite sequence of applications of the expression ++i that makes i == j. If j is reachable from i, they refer to the same container.
И ещё:
24.1.5 Just as a regular pointer to an array guarantees that there is a pointer value pointing past the last element of the array, so for any iterator type there is an iterator value that points past the last element of a corresponding container. These values are called past-the-end values. ...
И каждый день — без права на ошибку...
Re: сравнение (конечных (.end() итераторов от разных контейн
Здравствуйте, anton_p, Вы писали:
_>Привет всем, _>кто нибудь может подсказать параграфы стандарта где описывается поведение при сравнение итераторов, в частности "конечных", от разных контейнеров?
6 An iterator j is called reachable from an iterator i if and only if there is a finite sequence of applications of
the expression ++i that makes i == j. If j is reachable from i, they refer to elements of the same sequence.
7 Most of the library’s algorithmic templates that operate on data structures have interfaces that use ranges.
A range is a pair of iterators that designate the beginning and end of the computation. A range [i,i) is an
empty range; in general, a range [i,j) refers to the elements in the data structure starting with the element
pointed to by i and up to but not including the element pointed to by j. Range [i,j) is valid if and only if
j is reachable from i. The result of the application of functions in the library to invalid ranges is undefined.
Re: сравнение (конечных (.end() итераторов от разных контейн
Итератор — это указатель (адрес) на объекты в контейнере представленный в виде односвязанного списка.
Сравнивать итераторы разных контейнеров — т.е. объектов — по моему это бред, так как разные объеты имеют различные адреса в памяти.