Господа, такая ситуация:
Есть listView, и я хочу ассоциировать каждый итем этого listView каким-то с элементом из stl::list<struct>
Естественно что для этого очень удобно пользоваться итератором stl::list<struct>::iterator
Вопрос:
В lParam-е у каждого итема можно хранить или сам итератор (явно привести), т.к. несмотря на то что он является классом, его размер составляет 4 байта (у него на самом деле имеется один член — указатель).
Вот,
или же завести структурку, в которой хранить этот итератор,и в lParam записывать указатель на эту структурку, создавая её для каждого итема
??????
Здравствуйте, <Аноним>, Вы писали:
А>Есть listView, и я хочу ассоциировать каждый итем этого listView каким-то с элементом из stl::list<struct>
А>В lParam-е у каждого итема можно хранить или сам итератор (явно привести), т.к. несмотря на то что он является классом, его размер составляет 4 байта (у него на самом деле имеется один член — указатель).
Никто этого на самом деле не гарантирует. M$ может зарелизить новый компилятор, можно stl поменять... Много чего можно сделать.
Недавно правил сорцы Golded+ 1.1.4.7. Эти умники завязывались на то, что vector<int>::iterator — это int*
А>Вот, А>или же завести структурку, в которой хранить этот итератор,и в lParam записывать указатель на эту структурку, создавая её для каждого итема
Здравствуйте, Аноним, Вы писали:
А>Вопрос: А>В lParam-е у каждого итема можно хранить или сам итератор (явно привести), т.к. несмотря на то что он является классом, его размер составляет 4 байта (у него на самом деле имеется один член — указатель). А>Вот, А>или же завести структурку, в которой хранить этот итератор,и в lParam записывать указатель на эту структурку, создавая её для каждого итема А>??????
Ну если не задумываться о переносимости кода, то можно и сам итератор хранить. Но только очень осторожно. Лично я так никогда не делаю.
Теоретически так делать нельзя. Итератор — это черный ящик. Ты не знаешь как он устроен и сколько места занимет.
Более того при удалении/вставке элементов, итераторы могут "съехать" и начнутся глюки.
Если элементов не очень много, я предпочел бы бегать по списку исходя из номера элемента. В противном случае ввел бы какой-либо уникальный идентификатор каждого элемента подходящей размерности, да и вместо списка использовал бы set.
__________________________________
Василий Черневич (aka Willi)
Здравствуйте, Аноним, Вы писали:
А>Господа, такая ситуация: А>Есть listView, и я хочу ассоциировать каждый итем этого listView каким-то с элементом из stl::list<struct> А>Естественно что для этого очень удобно пользоваться итератором stl::list<struct>::iterator А>Вопрос: А>В lParam-е у каждого итема можно хранить или сам итератор (явно привести), т.к. несмотря на то что он является классом, его размер составляет 4 байта (у него на самом деле имеется один член — указатель).
Быть может уважаемый Аноном укажет место в стандарте, где сказано, что итератор std::list должен иметь размер 4 байта?
А>Вот, А>или же завести структурку, в которой хранить этот итератор,и в lParam записывать указатель на эту структурку, создавая её для каждого итема А>??????
Что мешает записывать в lParam указатель на элемент, соответствующий данному итератору? Или адрес самого итератора?
Здравствуйте, Willi, Вы писали:
W>Более того при удалении/вставке элементов, итераторы могут "съехать" и начнутся глюки.
Не совсем верно. Для std::list операция вставки не приводит к порче остальных итераторов. Операция удаления делает невалидным только те итераторы, которые соответствовали удаленным элементам.