Об итераторах списка
От: Аноним  
Дата: 13.05.03 09:40
Оценка:
Господа, такая ситуация:
Есть listView, и я хочу ассоциировать каждый итем этого listView каким-то с элементом из stl::list<struct>
Естественно что для этого очень удобно пользоваться итератором stl::list<struct>::iterator
Вопрос:
В lParam-е у каждого итема можно хранить или сам итератор (явно привести), т.к. несмотря на то что он является классом, его размер составляет 4 байта (у него на самом деле имеется один член — указатель).
Вот,
или же завести структурку, в которой хранить этот итератор,и в lParam записывать указатель на эту структурку, создавая её для каждого итема
??????
Re: Об итераторах списка
От: m.a.g. Мальта http://dottedmag.net/
Дата: 13.05.03 09:48
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>Есть listView, и я хочу ассоциировать каждый итем этого listView каким-то с элементом из stl::list<struct>


А>В lParam-е у каждого итема можно хранить или сам итератор (явно привести), т.к. несмотря на то что он является классом, его размер составляет 4 байта (у него на самом деле имеется один член — указатель).


Никто этого на самом деле не гарантирует. M$ может зарелизить новый компилятор, можно stl поменять... Много чего можно сделать.

Недавно правил сорцы Golded+ 1.1.4.7. Эти умники завязывались на то, что vector<int>::iterator — это int*

А>Вот,

А>или же завести структурку, в которой хранить этот итератор,и в lParam записывать указатель на эту структурку, создавая её для каждого итема

Этот вариант предпочтительнее.
... << RSDN@Home 1.0 beta 7a >>
Re: Об итераторах списка
От: Willi Интернет  
Дата: 13.05.03 09:50
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Вопрос:

А>В lParam-е у каждого итема можно хранить или сам итератор (явно привести), т.к. несмотря на то что он является классом, его размер составляет 4 байта (у него на самом деле имеется один член — указатель).
А>Вот,
А>или же завести структурку, в которой хранить этот итератор,и в lParam записывать указатель на эту структурку, создавая её для каждого итема
А>??????

Ну если не задумываться о переносимости кода, то можно и сам итератор хранить. Но только очень осторожно. Лично я так никогда не делаю.

Теоретически так делать нельзя. Итератор — это черный ящик. Ты не знаешь как он устроен и сколько места занимет.
Более того при удалении/вставке элементов, итераторы могут "съехать" и начнутся глюки.

Если элементов не очень много, я предпочел бы бегать по списку исходя из номера элемента. В противном случае ввел бы какой-либо уникальный идентификатор каждого элемента подходящей размерности, да и вместо списка использовал бы set.
__________________________________
Василий Черневич (aka Willi)
Re: Об итераторах списка
От: Bell Россия  
Дата: 13.05.03 09:53
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Господа, такая ситуация:

А>Есть listView, и я хочу ассоциировать каждый итем этого listView каким-то с элементом из stl::list<struct>
А>Естественно что для этого очень удобно пользоваться итератором stl::list<struct>::iterator
А>Вопрос:
А>В lParam-е у каждого итема можно хранить или сам итератор (явно привести), т.к. несмотря на то что он является классом, его размер составляет 4 байта (у него на самом деле имеется один член — указатель).

Быть может уважаемый Аноном укажет место в стандарте, где сказано, что итератор std::list должен иметь размер 4 байта?

А>Вот,

А>или же завести структурку, в которой хранить этот итератор,и в lParam записывать указатель на эту структурку, создавая её для каждого итема
А>??????

Что мешает записывать в lParam указатель на элемент, соответствующий данному итератору? Или адрес самого итератора?
lParam = &(*it);
//or
lParam = &it;
Любите книгу — источник знаний (с) М.Горький
Re[2]: Об итераторах списка
От: Bell Россия  
Дата: 13.05.03 09:57
Оценка:
Здравствуйте, Willi, Вы писали:

W>Более того при удалении/вставке элементов, итераторы могут "съехать" и начнутся глюки.

Не совсем верно. Для std::list операция вставки не приводит к порче остальных итераторов. Операция удаления делает невалидным только те итераторы, которые соответствовали удаленным элементам.
Любите книгу — источник знаний (с) М.Горький
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.