STL - валидность указателей на элементы контейнеров
От: Astaroth Россия  
Дата: 27.07.05 08:26
Оценка:
Подробное описание того, когда сохраняется/нарушается валидность итераторов в контейнерах STL есть в доке. А как насчёт валидности указателей на элементы этих контейнеров? Т.е. до каких пор указатель типа &(m.begin()+20) будет указывать на содержимое 20го эл-та контейнера?

Знаю, что использовать указатели на элементы контейнеров — плохая идея, но всё же.

28.07.05 01:23: Перенесено модератором из 'C/C++. Прикладные вопросы' — Павел Кузнецов
http://livejournal.com/users/breqwas
Re: STL - валидность указателей на элементы контейнеров
От: Bell Россия  
Дата: 27.07.05 08:30
Оценка:
Здравствуйте, Astaroth, Вы писали:

A>Подробное описание того, когда сохраняется/нарушается валидность итераторов в контейнерах STL есть в доке. А как насчёт валидности указателей на элементы этих контейнеров? Т.е. до каких пор указатель типа &(m.begin()+20) будет указывать на содержимое 20го эл-та контейнера?


Валидность указателя == валидность итератора.
Любите книгу — источник знаний (с) М.Горький
Re: STL - валидность указателей на элементы контейнеров
От: Astaroth Россия  
Дата: 27.07.05 08:35
Оценка:
Здравствуйте, Astaroth, Вы писали:

> &(m.begin()+20) будет указывать на содержимое 20го эл-та контейнера?


Ошибка — имелось в виду &(*(m.begin()+20)). Ну или просто &m[20].
http://livejournal.com/users/breqwas
Re: STL - валидность указателей на элементы контейнеров
От: sadomovalex Россия http://sadomovalex.blogspot.com
Дата: 27.07.05 10:09
Оценка:
Здравствуйте, Astaroth, Вы писали:

A>Подробное описание того, когда сохраняется/нарушается валидность итераторов в контейнерах STL есть в доке. А как насчёт валидности указателей на элементы этих контейнеров? Т.е. до каких пор указатель типа &(m.begin()+20) будет указывать на содержимое 20го эл-та контейнера?


A>Знаю, что использовать указатели на элементы контейнеров — плохая идея, но всё же.


&(*(m.begin()+20)) никогда не будет указывать на содержимое 20-го элемента. Такая кострукция указывает на 21-й элемент. Что же касается валидности итераторов, то как пишет Джосьютис:

Емкость векторов напрямую никогда не уменьшается, поэтому ссылки, указатели и итераторы заведомо остаются действительными даже при удалении элементов (при условии, что они ссылаются на позицию, расположенную перед модифицированными элементами). Однако вставка может привести к тому, что ссылки, указатели и итераторы станут недействительными.

"Что не завершено, не сделано вовсе" Гаусс
Re[2]: STL - валидность указателей на элементы контейнеров
От: MaximE Великобритания  
Дата: 27.07.05 11:25
Оценка:
Bell wrote:

> Здравствуйте, Astaroth, Вы писали:

>
> A>Подробное описание того, когда сохраняется/нарушается валидность итераторов в контейнерах STL есть в доке. А как насчёт валидности указателей на элементы этих контейнеров? Т.е. до каких пор указатель типа &(m.begin()+20) будет указывать на содержимое 20го эл-та контейнера?
>
> Валидность указателя == валидность итератора.

На практике это скорее всего так.

Но в теории, легко создать итератор для вектора (index + vector*), который не будет инвалидироваться при реаллокации элементов, т.е. итератор будет оставаться валидным, в то время как все ссылки и указатели нет.

--
Maxim Yegorushkin
Posted via RSDN NNTP Server 1.9
Re[3]: STL - валидность указателей на элементы контейнеров
От: CrystaX Россия https://crystax.me/
Дата: 27.07.05 11:31
Оценка:
Здравствуйте, MaximE, Вы писали:

ME>На практике это скорее всего так.


ME>Но в теории, легко создать итератор для вектора (index + vector*), который не будет инвалидироваться при реаллокации элементов, т.е. итератор будет оставаться валидным, в то время как все ссылки и указатели нет.


В этом случае итераторной у него останется только внешность, но не содержимое. Зачем нужен такой итератор, для разыменования которого нужно выполнять операцию индексации?
... << RSDN@Home 1.1.4 stable rev. 510>>
Re[4]: STL - валидность указателей на элементы контейнеров
От: MaximE Великобритания  
Дата: 27.07.05 11:40
Оценка:
CrystaX wrote:

> Здравствуйте, MaximE, Вы писали:

>
> ME>На практике это скорее всего так.
>
> ME>Но в теории, легко создать итератор для вектора (index + vector*), который не будет инвалидироваться при реаллокации элементов, т.е. итератор будет оставаться валидным, в то время как все ссылки и указатели нет.
>
> В этом случае итераторной у него останется только внешность, но не содержимое.

Стандартный итератор это и есть интерфейс и его семантика. Реализован он может быть как угодно.

> Зачем нужен такой итератор, для разыменования которого нужно выполнять операцию индексации?


А что страшного в этом случае происходит?

--
Maxim Yegorushkin
Posted via RSDN NNTP Server 1.9
Re[5]: STL - валидность указателей на элементы контейнеров
От: CrystaX Россия https://crystax.me/
Дата: 27.07.05 11:50
Оценка:
Здравствуйте, 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 - валидность указателей на элементы контейнеров
От: MaximE Великобритания  
Дата: 27.07.05 12:00
Оценка:
CrystaX wrote:

[]

>
> 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 - валидность указателей на элементы контейнеров
От: CrystaX Россия https://crystax.me/
Дата: 27.07.05 12:11
Оценка:
Здравствуйте, MaximE, Вы писали:

ME>Ты меня потерял.


ME>Я писал про итератор для вектора, который, в отличие от стандартного итератора вектора, не инвалидируется при реаллокации элементов. Состояние такого итератора есть:

ME>

ME>... итератор для вектора (index + vector*)...


Стоп. Чувствую, что чего-то не понимаю, но чего не понимаю, я не понимаю. Я разве не об этом же говорил? Такой итератор реализован как пара (указатель на начало, индекс). Так? А если так, то нафига он нужен, кроме как для обеспечения валидности даже при переаллокации? Тем более, что операции перебора статистически выполняются чаще, чем переаллокации.
... << RSDN@Home 1.1.4 stable rev. 510>>
Re[8]: STL - валидность указателей на элементы контейнеров
От: MaximE Великобритания  
Дата: 27.07.05 12:15
Оценка:
CrystaX wrote:

> Здравствуйте, MaximE, Вы писали:

>
> ME>Ты меня потерял.
>
> ME>Я писал про итератор для вектора, который, в отличие от стандартного итератора вектора, не инвалидируется при реаллокации элементов. Состояние такого итератора есть:
> ME>

> ME>... итератор для вектора (index + vector*)...
> ME>

>
> Стоп. Чувствую, что чего-то не понимаю, но чего не понимаю, я не понимаю. Я разве не об этом же говорил? Такой итератор реализован как пара (указатель на начало, индекс). Так? А если так, то нафига он нужен, кроме как для обеспечения валидности даже при переаллокации? Тем более, что операции перебора статистически выполняются чаще, чем переаллокации.

Как указатель на объект вектора (vector*) + индекс элемента в нем.

struct my_int_iter : iterator<int, ...>
{
     vector<int>* v;
     size_t i;

     // ...
     int& operator*() { return (*v)[i]; }
     // ...
};


--
Maxim Yegorushkin
Posted via RSDN NNTP Server 1.9
Re[9]: STL - валидность указателей на элементы контейнеров
От: CrystaX Россия https://crystax.me/
Дата: 27.07.05 12:16
Оценка:
Здравствуйте, MaximE, Вы писали:

ME>Как указатель на объект вектора (vector*) + индекс элемента в нем.


Те же яйца, вид в профиль.
... << RSDN@Home 1.1.4 stable rev. 510>>
Re[9]: STL - валидность указателей на элементы контейнеров
От: MaximE Великобритания  
Дата: 27.07.05 12:16
Оценка:
MaximE wrote:

[]

>
> struct my_int_iter : iterator<int, ...>
> {
>      vector<int>* v;
>      size_t i;
>
>      // ...
>      int& operator*() { return (*v)[i]; }
>      // ...
> };
>


тэги мля:

       int& operator*() { return (*v)[i_]; }


--
Maxim Yegorushkin
Posted via RSDN NNTP Server 1.9
Re[10]: STL - валидность указателей на элементы контейнеров
От: MaximE Великобритания  
Дата: 27.07.05 12:17
Оценка:
CrystaX wrote:

[]

> Те же яйца, вид в профиль.


Мужик, отдохни...

--
Maxim Yegorushkin
Posted via RSDN NNTP Server 1.9
Re[11]: STL - валидность указателей на элементы контейнеров
От: CrystaX Россия https://crystax.me/
Дата: 27.07.05 12:26
Оценка:
Здравствуйте, MaximE, Вы писали:

Не понял. Если мы о чем-то спорим, то давай хотя бы определимся о чем. А то похоже что говорим о разных вещах. Моя позиция: да, теоретически такой итератор создать можно, но а) его практическая ценность равна нулю и б) такой итератор не будет итератором по своей сути, вернее будет, но только снаружи, для его пользователей.
... << RSDN@Home 1.1.4 stable rev. 510>>
Re[12]: STL - валидность указателей на элементы контейнеров
От: MaximE Великобритания  
Дата: 27.07.05 12:47
Оценка:
CrystaX wrote:

> Здравствуйте, MaximE, Вы писали:

>
> Не понял. Если мы о чем-то спорим, то давай хотя бы определимся о чем. А то похоже что говорим о разных вещах. Моя позиция: да, теоретически такой итератор создать можно,

Он элементарно создается на практике.

> но а) его практическая ценность равна нулю


Такое нельзя утверждать. Иногда приходится использовать другие контейнеры вместо вектора только из-за того, что у вектора инвалидируются итераторы при реаллокации.

и б) такой итератор не будет итератором по своей сути, вернее будет, но только снаружи, для его пользователей.

Суть итератора: интерфейс и семантика. Никакой другой сути у него нет, поэтому, как только класс удовлетворяет требования стандарта к интерфейсу и семантике операций, этот класс есть итератор.

Я не понимаю, о чем ты тут толкуешь. Мною упомянутый итератор ведет себя в точности как стандартный итератор вектора, за исключением того, что он не инвалидируется при реаллокации.

--
Maxim Yegorushkin
Posted via RSDN NNTP Server 1.9
Re[13]: STL - валидность указателей на элементы контейнеров
От: CrystaX Россия https://crystax.me/
Дата: 27.07.05 12:53
Оценка:
Здравствуйте, MaximE, Вы писали:

>> Не понял. Если мы о чем-то спорим, то давай хотя бы определимся о чем. А то похоже что говорим о разных вещах. Моя позиция: да, теоретически такой итератор создать можно,


ME>Он элементарно создается на практике.


Насчет этого я и не спорил.

ME>Я не понимаю, о чем ты тут толкуешь. Мною упомянутый итератор ведет себя в точности как стандартный итератор вектора, за исключением того, что он не инвалидируется при реаллокации.


Ладно, замнем для ясности. Пусть это будет моим ИМХО. Я практической ценности не вижу.
... << RSDN@Home 1.1.4 stable rev. 510>>
Re[14]: STL - валидность указателей на элементы контейнеров
От: dad  
Дата: 04.08.05 05:42
Оценка:
CX>Ладно, замнем для ясности. Пусть это будет моим ИМХО. Я практической ценности не вижу.

практическая ценность есть — при использовании итераторов не имея доступа к самому экземпляру вектора.
и использование итераторов без доступа к экземпляру происходит повсеместно, если ты используешь stl
и ее концепции.
Веру-ю-у! В авиацию, в научную революци-ю-у, в механизацию сельского хозяйства, в космос и невесомость! Веру-ю-у! Ибо это объективно-о! (Шукшин)
Re[15]: STL - валидность указателей на элементы контейнеров
От: CrystaX Россия https://crystax.me/
Дата: 04.08.05 05:50
Оценка:
Здравствуйте, dad, Вы писали:

CX>>Ладно, замнем для ясности. Пусть это будет моим ИМХО. Я практической ценности не вижу.


dad>практическая ценность есть — при использовании итераторов не имея доступа к самому экземпляру вектора.

dad>и использование итераторов без доступа к экземпляру происходит повсеместно, если ты используешь stl
dad>и ее концепции.

Я имею представление о роли итераторов в современном мире.
Я говорил не об итераторах вообще, а о неинвалидирующихся при реаллокации вектора.
... << RSDN@Home 1.1.4 stable rev. 510>>
Re[16]: STL - валидность указателей на элементы контейнеров
От: dad  
Дата: 04.08.05 07:00
Оценка:
dad>>практическая ценность есть — при использовании итераторов не имея доступа к самому экземпляру вектора.
dad>>и использование итераторов без доступа к экземпляру происходит повсеместно, если ты используешь stl
dad>>и ее концепции.

CX>Я имею представление о роли итераторов в современном мире.


да, смешно

CX>Я говорил не об итераторах вообще, а о неинвалидирующихся при реаллокации вектора.


очень полезно, например, учитывая возможность вектора резервировать место без вызова конструкторов, для объектов хранимых по значению.
Веру-ю-у! В авиацию, в научную революци-ю-у, в механизацию сельского хозяйства, в космос и невесомость! Веру-ю-у! Ибо это объективно-о! (Шукшин)
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.