Связь итератора и указателя списка STL
От: Аноним  
Дата: 10.02.08 18:22
Оценка:
Здравствуйте. Подскажите, как получить итератор элемента списка (list), имея указатель на элемент этого списка? Указатель я получаю таким образом:
&(*mylist.begin()), приведя его к void*, затем передаю как параметр функции. Возможно, есть более простой способ получить ссылку на элемент (правда, программа состоит из нескольких модулей на разных языках, так что, это первое, что пришло в голову)?
Может где-то можно почитать про внутреннее устройство контейнеров STL?
Спасибо
Re: Связь итератора и указателя списка STL
От: _nn_  
Дата: 10.02.08 18:39
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте. Подскажите, как получить итератор элемента списка (list), имея указатель на элемент этого списка? Указатель я получаю таким образом:

А>&(*mylist.begin()), приведя его к void*, затем передаю как параметр функции. Возможно, есть более простой способ получить ссылку на элемент (правда, программа состоит из нескольких модулей на разных языках, так что, это первое, что пришло в голову)?
А>Может где-то можно почитать про внутреннее устройство контейнеров STL?
А>Спасибо

Чем хуже будет передавать указатель на сам список ?
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re: Связь итератора и указателя списка STL
От: Roman Odaisky Украина  
Дата: 10.02.08 19:18
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте. Подскажите, как получить итератор элемента списка (list), имея указатель на элемент этого списка?


Это уже обсуждалось, немало флеймили.

Никак.

А>Указатель я получаю таким образом: &(*mylist.begin()), приведя его к void*, затем передаю как параметр функции.


А что мешает передавать собственно итератор? Если не хочется делать функцию шаблонной, можно использовать any_iterator.
До последнего не верил в пирамиду Лебедева.
Re[2]: Связь итератора и указателя списка STL
От: Аноним  
Дата: 10.02.08 19:27
Оценка:
Здравствуйте, _nn_, Вы писали:
__>Чем хуже будет передавать указатель на сам список ?
&(*mylist.begin()) я привел для примера . Нужно передать указатель все-таки на конкретный элемент. Непонятно только, какая связь между итератором и указателем . Итератор — это и есть объект-оболочка указателя? Может у него и свойства есть, наподобие адреса текущего элемента?

P.S. Прошу прощения за возможно глупый вопрос, раньше писал только на С, теперь со своей реализацией списков не хочеться возиться
Re: Связь итератора и указателя списка STL
От: Аноним  
Дата: 10.02.08 19:59
Оценка:
Еще раз извините за флуд... Использование указателей — кажется, единственный выход для ссылающихся друг на друга структур. Как раз такая ситуация у меня, менять что-либо уже поздно . В этом вся проблема. И как раз в any_iterator нужно указывать тип структуры, которая определена ниже по тексту. Проектировка программы, мягко сказать, ужасная, но уже какую дали на доработку..
Re: Связь итератора и указателя списка STL
От: игппук Беларусь  
Дата: 10.02.08 20:00
Оценка:
никак. просмотрите вариант на неправильное проектирование программы. при правильном проектировании подобных вопросов возникать не должно.
проклятый антисутенерский закон
Re[3]: Связь итератора и указателя списка STL
От: gear nuke  
Дата: 12.02.08 15:37
Оценка:
Здравствуйте, <Аноним>, Вы писали:

Короткий ответ уже дан, но не ради флейма, а поскольку работу то надо сделать, попробую дать длинный.

А>Нужно передать указатель все-таки на конкретный элемент. Непонятно только, какая связь между итератором и указателем . Итератор — это и есть объект-оболочка указателя?


Все раелизации STL разные, но идут с исходниками. Под конкретную реализацию можно сделать хак. Правда разобраться, зачем и как используется allocator::rebind вряд ли сразу удастся.

Но достаточно посмотреть, что представляет из себя нода (и обязательно свериться с отладчиком). Итератор — суть указатель на неё. Вот например из MSVC 2005
    struct _Node
        {   // list node
        _Genptr _Next;  // successor node, or first element if head
        _Genptr _Prev;  // predecessor node, or last element if head
        _Ty _Myval; // the stored value, unused if head
        };

Тут ничего необычного для С-шника нет, обычный интрузивный список, какой-нибудь макрос CONTAINING_RECORD должен сработать.

Хотя все же стоит обратить внимание на другие ответы, что бы после смерти в гробу не переворачиваться
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.