Здравствуйте. Подскажите, как получить итератор элемента списка (list), имея указатель на элемент этого списка? Указатель я получаю таким образом:
&(*mylist.begin()), приведя его к void*, затем передаю как параметр функции. Возможно, есть более простой способ получить ссылку на элемент (правда, программа состоит из нескольких модулей на разных языках, так что, это первое, что пришло в голову)?
Может где-то можно почитать про внутреннее устройство контейнеров STL?
Спасибо
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте. Подскажите, как получить итератор элемента списка (list), имея указатель на элемент этого списка? Указатель я получаю таким образом: А>&(*mylist.begin()), приведя его к void*, затем передаю как параметр функции. Возможно, есть более простой способ получить ссылку на элемент (правда, программа состоит из нескольких модулей на разных языках, так что, это первое, что пришло в голову)? А>Может где-то можно почитать про внутреннее устройство контейнеров STL? А>Спасибо
Чем хуже будет передавать указатель на сам список ?
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте. Подскажите, как получить итератор элемента списка (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 нужно указывать тип структуры, которая определена ниже по тексту. Проектировка программы, мягко сказать, ужасная, но уже какую дали на доработку..
Короткий ответ уже дан, но не ради флейма, а поскольку работу то надо сделать, попробую дать длинный.
А>Нужно передать указатель все-таки на конкретный элемент. Непонятно только, какая связь между итератором и указателем . Итератор — это и есть объект-оболочка указателя?
Все раелизации 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