Подробное описание того, когда сохраняется/нарушается валидность итераторов в контейнерах STL есть в доке. А как насчёт валидности указателей на элементы этих контейнеров? Т.е. до каких пор указатель типа &(m.begin()+20) будет указывать на содержимое 20го эл-та контейнера?
Знаю, что использовать указатели на элементы контейнеров — плохая идея, но всё же.
28.07.05 01:23: Перенесено модератором из 'C/C++. Прикладные вопросы' — Павел Кузнецов
Здравствуйте, Astaroth, Вы писали:
A>Подробное описание того, когда сохраняется/нарушается валидность итераторов в контейнерах STL есть в доке. А как насчёт валидности указателей на элементы этих контейнеров? Т.е. до каких пор указатель типа &(m.begin()+20) будет указывать на содержимое 20го эл-та контейнера?
Валидность указателя == валидность итератора.
Любите книгу — источник знаний (с) М.Горький
Re: STL - валидность указателей на элементы контейнеров
Здравствуйте, Astaroth, Вы писали:
A>Подробное описание того, когда сохраняется/нарушается валидность итераторов в контейнерах STL есть в доке. А как насчёт валидности указателей на элементы этих контейнеров? Т.е. до каких пор указатель типа &(m.begin()+20) будет указывать на содержимое 20го эл-та контейнера?
A>Знаю, что использовать указатели на элементы контейнеров — плохая идея, но всё же.
&(*(m.begin()+20)) никогда не будет указывать на содержимое 20-го элемента. Такая кострукция указывает на 21-й элемент. Что же касается валидности итераторов, то как пишет Джосьютис:
Емкость векторов напрямую никогда не уменьшается, поэтому ссылки, указатели и итераторы заведомо остаются действительными даже при удалении элементов (при условии, что они ссылаются на позицию, расположенную перед модифицированными элементами). Однако вставка может привести к тому, что ссылки, указатели и итераторы станут недействительными.
"Что не завершено, не сделано вовсе" Гаусс
Re[2]: STL - валидность указателей на элементы контейнеров
Bell wrote:
> Здравствуйте, Astaroth, Вы писали: > > A>Подробное описание того, когда сохраняется/нарушается валидность итераторов в контейнерах STL есть в доке. А как насчёт валидности указателей на элементы этих контейнеров? Т.е. до каких пор указатель типа &(m.begin()+20) будет указывать на содержимое 20го эл-та контейнера? > > Валидность указателя == валидность итератора.
На практике это скорее всего так.
Но в теории, легко создать итератор для вектора (index + vector*), который не будет инвалидироваться при реаллокации элементов, т.е. итератор будет оставаться валидным, в то время как все ссылки и указатели нет.
-- Maxim Yegorushkin
Posted via RSDN NNTP Server 1.9
Re[3]: STL - валидность указателей на элементы контейнеров
Здравствуйте, MaximE, Вы писали:
ME>На практике это скорее всего так.
ME>Но в теории, легко создать итератор для вектора (index + vector*), который не будет инвалидироваться при реаллокации элементов, т.е. итератор будет оставаться валидным, в то время как все ссылки и указатели нет.
В этом случае итераторной у него останется только внешность, но не содержимое. Зачем нужен такой итератор, для разыменования которого нужно выполнять операцию индексации?
... << RSDN@Home 1.1.4 stable rev. 510>>
Re[4]: STL - валидность указателей на элементы контейнеров
CrystaX wrote:
> Здравствуйте, MaximE, Вы писали: > > ME>На практике это скорее всего так. > > ME>Но в теории, легко создать итератор для вектора (index + vector*), который не будет инвалидироваться при реаллокации элементов, т.е. итератор будет оставаться валидным, в то время как все ссылки и указатели нет. > > В этом случае итераторной у него останется только внешность, но не содержимое.
Стандартный итератор это и есть интерфейс и его семантика. Реализован он может быть как угодно.
> Зачем нужен такой итератор, для разыменования которого нужно выполнять операцию индексации?
А что страшного в этом случае происходит?
-- Maxim Yegorushkin
Posted via RSDN NNTP Server 1.9
Re[5]: STL - валидность указателей на элементы контейнеров
Здравствуйте, MaximE, Вы писали:
>> В этом случае итераторной у него останется только внешность, но не содержимое.
ME>Стандартный итератор это и есть интерфейс и его семантика. Реализован он может быть как угодно.
Ну, теоретически он при разыменовании может NASA информировать о факте разыменования, но только где ж такие найти?
>> Зачем нужен такой итератор, для разыменования которого нужно выполнять операцию индексации?
ME>А что страшного в этом случае происходит?
vector<int> v;
for(vector<int>::const_iterator it = v.begin(), lim = v.end(); it != lim; ++it)
{
int n = *it;
// do something
}
for(vector<int>::size_type it = 0, lim = v.size(); it != lim; ++it)
{
int n = v[it];
// do something
}
В случае, если итератор реализован как пара (указатель на начало, индекс), оба варианта равнозначны, а потому в таких итераторах мало смысла.
... << RSDN@Home 1.1.4 stable rev. 510>>
Re[6]: STL - валидность указателей на элементы контейнеров
> vector<int> v;
> for(vector<int>::const_iterator it = v.begin(), lim = v.end(); it != lim; ++it)
> {
> int n = *it;
> // do something
> }
> for(vector<int>::size_type it = 0, lim = v.size(); it != lim; ++it)
> {
> int n = v[it];
> // do something
> }
>
> > В случае, если итератор реализован как пара (указатель на начало, индекс), оба варианта равнозначны, а потому в таких итераторах мало смысла.
Ты меня потерял.
Я писал про итератор для вектора, который, в отличие от стандартного итератора вектора, не инвалидируется при реаллокации элементов. Состояние такого итератора есть:
... итератор для вектора (index + vector*)...
-- Maxim Yegorushkin
Posted via RSDN NNTP Server 1.9
Re[7]: STL - валидность указателей на элементы контейнеров
Здравствуйте, MaximE, Вы писали:
ME>Ты меня потерял.
ME>Я писал про итератор для вектора, который, в отличие от стандартного итератора вектора, не инвалидируется при реаллокации элементов. Состояние такого итератора есть: ME>
ME>... итератор для вектора (index + vector*)...
Стоп. Чувствую, что чего-то не понимаю, но чего не понимаю, я не понимаю. Я разве не об этом же говорил? Такой итератор реализован как пара (указатель на начало, индекс). Так? А если так, то нафига он нужен, кроме как для обеспечения валидности даже при переаллокации? Тем более, что операции перебора статистически выполняются чаще, чем переаллокации.
... << RSDN@Home 1.1.4 stable rev. 510>>
Re[8]: STL - валидность указателей на элементы контейнеров
CrystaX wrote:
> Здравствуйте, MaximE, Вы писали: > > ME>Ты меня потерял. > > ME>Я писал про итератор для вектора, который, в отличие от стандартного итератора вектора, не инвалидируется при реаллокации элементов. Состояние такого итератора есть: > ME>
> ME>... итератор для вектора (index + vector*)...
> ME>
> > Стоп. Чувствую, что чего-то не понимаю, но чего не понимаю, я не понимаю. Я разве не об этом же говорил? Такой итератор реализован как пара (указатель на начало, индекс). Так? А если так, то нафига он нужен, кроме как для обеспечения валидности даже при переаллокации? Тем более, что операции перебора статистически выполняются чаще, чем переаллокации.
Как указатель на объект вектора (vector*) + индекс элемента в нем.
Не понял. Если мы о чем-то спорим, то давай хотя бы определимся о чем. А то похоже что говорим о разных вещах. Моя позиция: да, теоретически такой итератор создать можно, но а) его практическая ценность равна нулю и б) такой итератор не будет итератором по своей сути, вернее будет, но только снаружи, для его пользователей.
... << RSDN@Home 1.1.4 stable rev. 510>>
Re[12]: STL - валидность указателей на элементы контейнеров
CrystaX wrote:
> Здравствуйте, MaximE, Вы писали: > > Не понял. Если мы о чем-то спорим, то давай хотя бы определимся о чем. А то похоже что говорим о разных вещах. Моя позиция: да, теоретически такой итератор создать можно,
Он элементарно создается на практике.
> но а) его практическая ценность равна нулю
Такое нельзя утверждать. Иногда приходится использовать другие контейнеры вместо вектора только из-за того, что у вектора инвалидируются итераторы при реаллокации.
и б) такой итератор не будет итератором по своей сути, вернее будет, но только снаружи, для его пользователей.
Суть итератора: интерфейс и семантика. Никакой другой сути у него нет, поэтому, как только класс удовлетворяет требования стандарта к интерфейсу и семантике операций, этот класс есть итератор.
Я не понимаю, о чем ты тут толкуешь. Мною упомянутый итератор ведет себя в точности как стандартный итератор вектора, за исключением того, что он не инвалидируется при реаллокации.
-- Maxim Yegorushkin
Posted via RSDN NNTP Server 1.9
Re[13]: STL - валидность указателей на элементы контейнеров
Здравствуйте, MaximE, Вы писали:
>> Не понял. Если мы о чем-то спорим, то давай хотя бы определимся о чем. А то похоже что говорим о разных вещах. Моя позиция: да, теоретически такой итератор создать можно,
ME>Он элементарно создается на практике.
Насчет этого я и не спорил.
ME>Я не понимаю, о чем ты тут толкуешь. Мною упомянутый итератор ведет себя в точности как стандартный итератор вектора, за исключением того, что он не инвалидируется при реаллокации.
Ладно, замнем для ясности. Пусть это будет моим ИМХО. Я практической ценности не вижу.
... << RSDN@Home 1.1.4 stable rev. 510>>
Re[14]: STL - валидность указателей на элементы контейнеров
CX>Ладно, замнем для ясности. Пусть это будет моим ИМХО. Я практической ценности не вижу.
практическая ценность есть — при использовании итераторов не имея доступа к самому экземпляру вектора.
и использование итераторов без доступа к экземпляру происходит повсеместно, если ты используешь stl
и ее концепции.
Веру-ю-у! В авиацию, в научную революци-ю-у, в механизацию сельского хозяйства, в космос и невесомость! Веру-ю-у! Ибо это объективно-о! (Шукшин)
Re[15]: STL - валидность указателей на элементы контейнеров
Здравствуйте, dad, Вы писали:
CX>>Ладно, замнем для ясности. Пусть это будет моим ИМХО. Я практической ценности не вижу.
dad>практическая ценность есть — при использовании итераторов не имея доступа к самому экземпляру вектора. dad>и использование итераторов без доступа к экземпляру происходит повсеместно, если ты используешь stl dad>и ее концепции.
Я имею представление о роли итераторов в современном мире.
Я говорил не об итераторах вообще, а о неинвалидирующихся при реаллокации вектора.
... << RSDN@Home 1.1.4 stable rev. 510>>
Re[16]: STL - валидность указателей на элементы контейнеров
dad>>практическая ценность есть — при использовании итераторов не имея доступа к самому экземпляру вектора. dad>>и использование итераторов без доступа к экземпляру происходит повсеместно, если ты используешь stl dad>>и ее концепции.
CX>Я имею представление о роли итераторов в современном мире.
да, смешно
CX>Я говорил не об итераторах вообще, а о неинвалидирующихся при реаллокации вектора.
очень полезно, например, учитывая возможность вектора резервировать место без вызова конструкторов, для объектов хранимых по значению.
Веру-ю-у! В авиацию, в научную революци-ю-у, в механизацию сельского хозяйства, в космос и невесомость! Веру-ю-у! Ибо это объективно-о! (Шукшин)
Re[17]: STL - валидность указателей на элементы контейнеров
Здравствуйте, dad, Вы писали:
CX>>Я говорил не об итераторах вообще, а о неинвалидирующихся при реаллокации вектора.
dad>очень полезно, например, учитывая возможность вектора резервировать место без вызова конструкторов, для объектов хранимых по значению.
Повторюсь еще раз — я практической ценности не вижу. Я понимаю, что это будет работать и такие итераторы совсем не сложно сотворить самому. Но я не вижу, зачем это может быть нужно. Если я знаю о возможных реаллокациях, я не закладываюсь на валидность итераторов, не храню их где попало. Или же беру другой контейнер, который не инвалидирует итераторы (тот же list). Не хочу даже спорить на эту тему, я свою точку зрения высказал. Если кто-то не согласен — ок, никаких возражений, я никому ничего не навязываю. Я же ценности не вижу. На этом обсуждение закрываю.
... << RSDN@Home 1.1.4 stable rev. 510>>
Re[18]: STL - валидность указателей на элементы контейнеров
dad>>очень полезно, например, учитывая возможность вектора резервировать место без вызова конструкторов, для объектов хранимых по значению.
CX>Повторюсь еще раз — я практической ценности не вижу. Я понимаю, что это будет работать и такие итераторы совсем не сложно сотворить самому. Но я не вижу, зачем это может быть нужно. Если я знаю о возможных реаллокациях, я не закладываюсь на валидность итераторов, не храню их где попало. Или же беру другой контейнер, который не инвалидирует итераторы (тот же list). Не хочу даже спорить на эту тему, я свою точку зрения высказал. Если кто-то не согласен — ок, никаких возражений, я никому ничего не навязываю. Я же ценности не вижу. На этом обсуждение закрываю.
хорошо
Веру-ю-у! В авиацию, в научную революци-ю-у, в механизацию сельского хозяйства, в космос и невесомость! Веру-ю-у! Ибо это объективно-о! (Шукшин)