Отправляет email-рассылки с помощью сервиса Sendsay

Программирование. Форум !!!

STL итераторы

Приветствую comp,

вдруг неоджиданно возник такой вопрос:
в библиотеке STL различные объекты в контейнерах идентифицируются
"итераторами", которые сами являются объектами собственного класса.
В MFC все объекты идентифицируются с помощью POSITION, которая есть
ни что иное как указатель, занимает 4 байта и гарантированно
влезает в разного рода lParam'ы, SetItemData() и т.д. А как быть с
STL? Есть ли гарантия того, что итератор можно запихать в 4 байта?
(мне нужен multimap, которого в MFC к сожалению нету)
P.S. Глянул в код STL, мне поплохело от всех наворотов которые там
наворочены:)

Ответить   Wed, 20 Jul 2005 19:48:25 +0400 (#404661)

 

Ответы:

Итератор является указателем, а следовательно должен "влазить" в 4 байта. ИМХО

Номер выпуска : 4789
Возраст листа : 669 (дней)
Количество подписчиков : 524
Адрес в архиве : http://subscribe.ru/archive/comp.soft.prog.prog/msg/404902
Получить правила : mailto:comp.soft.prog.prog-rules@subscribe.ru
Формат "дайджест" : mailto:comp.soft.prog.prog-digest@subscribe.ru
Формат "каждое письмо" : mailto:comp.soft.prog.prog-normal@subscribe.ru
Формат "читать с веба" : mailto:comp.soft.prog.prog-webonly@subscribe.ru

Ответить   Thu, 21 Jul 2005 07:09:13 +0400 (#404902)

 

Неть!

Итератор - это прежде всего объект :-)

Он только ведет себя как указатель. Т.е. поддерживает операции * и ->
А также ++ и прочие. Разные итераторы поддерживают разные операции. И с
разной эффективностью. :-)

Таким образом, через такие маздайные изобретения, как lParam и прочие, лучше

передавать указатель на итератор :-) Или указатель на структуру, в которой
есть итератор. Или еще как-нибудь, но не сам итератор.

Номер выпуска : 4793
Возраст листа : 669 (дней)
Количество подписчиков : 524
Адрес в архиве : http://subscribe.ru/archive/comp.soft.prog.prog/msg/405391
Получить правила : mailto:comp.soft.prog.prog-rules@subscribe.ru
Формат "дайджест" : mailto:comp.soft.prog.prog-digest@subscribe.ru
Формат "каждое письмо" : mailto:comp.soft.prog.prog-normal@subscribe.ru
Формат "читать с веба" : mailto:comp.soft.prog.prog-webonly@subscribe.ru

Ответить   Thu, 21 Jul 2005 23:08:38 +0600 (#405391)

 

Здравствуйте !


Угу. Так оно и есть.
Мало того, упоминавшийся здесь тип POSITION - также не обязан быть
указателем (это 32 битная переменная - трактуется разными функциями
по-разному). Просто удобно использовать некое подобие итератора
при программировании только с использованием API, например.
Этакий дескриптор, смысл содержимого которого, ессно, недокументирован.
Повышается уровень абстракции, что помогает писать более надежный код.

Обьявляется, кстати, так:

// abstract iteration position
struct __POSITION { };
typedef __POSITION* POSITION;

--
С уважением, Вахтуров Виктор.

Номер выпуска : 4794
Возраст листа : 670 (дней)
Количество подписчиков : 524
Адрес в архиве : http://subscribe.ru/archive/comp.soft.prog.prog/msg/405455
Получить правила : mailto:comp.soft.prog.prog-rules@subscribe.ru
Формат "дайджест" : mailto:comp.soft.prog.prog-digest@subscribe.ru
Формат "каждое письмо" : mailto:comp.soft.prog.prog-normal@subscribe.ru
Формат "читать с веба" : mailto:comp.soft.prog.prog-webonly@subscribe.ru

Ответить   Thu, 21 Jul 2005 22:12:58 +0400 (#405455)

 

Hello Юрчик,

Thursday, July 21, 2005, 9:08:38 PM, you wrote:

Я думал об этом... Но если хранить указатель на итератор, то где
хранить сам итератор (он уже не может быть локальной переменной!!!)
Получается, что нужно заводить еще и список итераторов, используемых
объектом, хранить их в объекте... все это, ясное дело, не подходит,
т.к. отследить все это просто невозможно.
Реально sizeof от итератора дает 4 байта, но всегда ли это так?

Есть еще идея, но опять знаний не хватает. Хранить указатели на сами
элементы и пользоваться какими-то функциями преобразования, которые по
указателю на элемент и самой переменной контейнера формируют итератор,
указывающий на этот элемент. Есть ли такие функции?

Ответить   Fri, 22 Jul 2005 19:00:45 +0400 (#405885)

 

Из C++ in a Nutshell (http://club.shelek.com/download.php?id=187)
An iterator is an abstraction of a pointer used for pointing into containers
and other sequences

единственное, где нашел все таки. но не первое где видел. Все таки говорят что
итератор - указатель на контейнеры

Номер выпуска : 4799
Возраст листа : 671 (дней)
Количество подписчиков : 526
Адрес в архиве : http://subscribe.ru/archive/comp.soft.prog.prog/msg/406200
Получить правила : mailto:comp.soft.prog.prog-rules@subscribe.ru
Формат "дайджест" : mailto:comp.soft.prog.prog-digest@subscribe.ru
Формат "каждое письмо" : mailto:comp.soft.prog.prog-normal@subscribe.ru
Формат "читать с веба" : mailto:comp.soft.prog.prog-webonly@subscribe.ru

Ответить   Sat, 23 Jul 2005 13:52:37 +0400 (#406200)

 

Здравствуйте !


Указатель и _абстракция_ указателя...
Чувствуете разницу ?
Итератор (само значение) может быть индексов чего то в чем то.
Содержимое итератора не обязано укладываться в 4 (или сколько там) байт
может быть чем то сложным (структурой, например).

Про соглашения для итераторов читаем тут:
http://msdn.microsoft.com/library/en-us/vcstdlib/html/vclrfIteratorConventio

ns.asp

--
С уважением, Вахтуров Виктор.

Номер выпуска : 4801
Возраст листа : 671 (дней)
Количество подписчиков : 526
Адрес в архиве : http://subscribe.ru/archive/comp.soft.prog.prog/msg/406368
Получить правила : mailto:comp.soft.prog.prog-rules@subscribe.ru
Формат "дайджест" : mailto:comp.soft.prog.prog-digest@subscribe.ru
Формат "каждое письмо" : mailto:comp.soft.prog.prog-normal@subscribe.ru
Формат "читать с веба" : mailto:comp.soft.prog.prog-webonly@subscribe.ru

Ответить   Sat, 23 Jul 2005 23:22:26 +0400 (#406368)

 

Приветствую вас, gena utkin!

23.07.2005 14:52 вы писали:

что

Из вышеприведенной цитаты это не следует никаким боком, так же как и из
первоисточника:

24.1 [lib.iterator.requirements]
Iterators are a generalization of pointers that allow a C++ program to
work with different data structures (containers) in a uniform manner.
(Стандарт C++)

Итератор в понятии STL - это объект, обладающий интерфейсом с
определенной семантикой, не более того. Обычные указатели подпадают под
определение random-access iterators. Но итератор - более широкое понятие.

В реализации Dinkumware STL, которая идет с VC 7.1,
sizeof(std::deque<T>::iterator) == 8. Это итератор? Итератор. Указателем
является? Нет.

Ответить   Sat, 23 Jul 2005 19:37:28 +0500 (#406395)

 

Почему не может? Если та функция, которая имеет в качестве локальной
переменной этот итератор, будет присутствовать в стеке вызовов в момент
использования этого итератора, то все ОК :-)

Или, если нельзя сделать локальным, то, наверно, можно сделать глобальным? В

таком случае вообще ничего передавать не придется. :-)

Или вообще выделить под него память динамически. :-)

Не знаю. :-) Я посмотрел, у мультимэпа 4, у списка тоже. Но я не думаю, что
на это можно полагаться.

Я не знаю таких функций...

Я вот думаю, а действительно ли нужен итератор? :-) Если интересует только
то значение, на которое он указывает, и нет необходимости перемещаться по
контейнеру, то хватит простого указателя.

А если нужен итератор, то можно найти это значение в этом мультимэпе. :-)
Сначала определить верхнюю и нижнюю границы (upper_bound() и lower_bound()
соответственно), а потом линейно найти тот элемент, адрес которого совпадает

со значением указателя. :-)

Изврат? :-) Согласен.

Номер выпуска : 4800
Возраст листа : 671 (дней)
Количество подписчиков : 526
Адрес в архиве : http://subscribe.ru/archive/comp.soft.prog.prog/msg/406364
Получить правила : mailto:comp.soft.prog.prog-rules@subscribe.ru
Формат "дайджест" : mailto:comp.soft.prog.prog-digest@subscribe.ru
Формат "каждое письмо" : mailto:comp.soft.prog.prog-normal@subscribe.ru
Формат "читать с веба" : mailto:comp.soft.prog.prog-webonly@subscribe.ru

Ответить   Sun, 24 Jul 2005 01:06:50 +0600 (#406364)