Russian Qt Forum
Ноябрь 26, 2024, 13:21 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 [2]   Вниз
  Печать  
Автор Тема: В каких контейнерах данные перемещаемы ?  (Прочитано 10756 раз)
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #15 : Июль 09, 2011, 11:07 »

Да, действительно, все четко написано. Напр std::map
http://www.sgi.com/tech/stl/Map.html
Цитировать
Map has the important property that inserting a new element into a map does not invalidate iterators that point to existing elements. Erasing an element from a map also does not invalidate any iterators, except, of course, for iterators that actually point to the element that is being erased.
Спасибо
Записан
ритт
Гость
« Ответ #16 : Июль 09, 2011, 14:31 »

опять-таки, это не обязательно означает, что адрес элемента останется прежним
Записан
brankovic
Гость
« Ответ #17 : Июль 09, 2011, 15:08 »

опять-таки, это не обязательно означает, что адрес элемента останется прежним

Там много текста было, трудно воспринимается. Ещё раз подчеркну главное. Итак, цитирую стандарт C++ о std::list::erase:

Effects: Invalidates only the iterators and references to the erased elements.
Записан
ритт
Гость
« Ответ #18 : Июль 10, 2011, 08:24 »

лядь, там про std::map, тут откуда-то std::list::erase взялся...
Записан
brankovic
Гость
« Ответ #19 : Июль 10, 2011, 11:02 »

лядь, там про std::map, тут откуда-то std::list::erase взялся...

уж и не знаю как вам втолковать. Наверное лучше прямо стандарт почитать. Там главка есть про каждый контейнер. Если почувствуете что теряетесь, то поищите поиском слово invalidate.
Записан
ритт
Гость
« Ответ #20 : Июль 10, 2011, 14:12 »

лядь, там про std::map, тут откуда-то std::list::erase взялся...

уж и не знаю как вам втолковать. Наверное лучше прямо стандарт почитать. Там главка есть про каждый контейнер. Если почувствуете что теряетесь, то поищите поиском слово invalidate.

так мб перестать "втолковывать" одно и то же кругами - про валидность и невалидность итераторов? прочтите внимательно оригинальный вопрос треда - там речь об указателях на объекты, а не об итераторах. хоть в общем случае итератор - это унифицированная надстройка над указателем на ячейку, хранящую объект, и в частном случае адрес ячейки равен адресу самого объекта, но (в зависимости от типа объекта и/или типа контейнера) адрес ячейки может быть равен адресу указателя на объект...или на слайс, или ещё на что-нибудь - я и вывел "общий ответ" выше...
далее, std::list - это банальный двунаправленный список - тут и ежу понятно, что удаление произвольной ноды никоим образом не влияет на цикл жизни остальных нод того же списка - так какой интерес всюду приводить его в пример? да и какая связь с указателями, опять же? std::map уже интереснее - там сбалансированное дерево (которое я, честно говоря, уже с трудом вспоминаю) - и вот есть в документации строка
Цитировать
Map has the important property that inserting a new element into a map does not invalidate iterators that point to existing elements.
, которая, опять-таки, совершенно не проливает свет на вопрос об указателях...ладно, пустое...

вкратце: допустим, Igors'у изначально ну позарез нужно было хранить указатель на объект (скажем, в некотором другом контейнере), Вы ему предлагаете забыть про указатели и хранить вместо них итераторы? хорошо, общий ответ: для ряда случаев и контейнеров итераторы - то, что вам нужно; для другого ряда - не совсем то; указатели - чаще совсем не то.
консенсус? тему можно закрывать?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #21 : Июль 10, 2011, 15:52 »

далее, std::list - это банальный двунаправленный список - тут и ежу понятно, что удаление произвольной ноды никоим образом не влияет ..
Ежу все понятно - потому у него вместо мозгов иголки Улыбающийся А где гарантия что в конкретной реализации - и.т.п. как Вы недавно рассказывали? Допустим разработчик захотел распределять ноды блоками в целях оптимизации - тогда их перемещение при удалении/вставке вполне возможно.

вкратце: допустим, Igors'у изначально ну позарез нужно было хранить указатель на объект (скажем, в некотором другом контейнере), Вы ему предлагаете забыть про указатели и хранить вместо них итераторы? хорошо, общий ответ: для ряда случаев и контейнеров итераторы - то, что вам нужно; для другого ряда - не совсем то; указатели - чаще совсем не то.
консенсус? тему можно закрывать?
Общий ответ - это документировано и оговаривается стандартом для каждого stl контейнера. Валидность итератора автоматически означает и неизменность возвращаемой им ссылки (а поскольку никто мне не может помешать взять адрес от ссылки - то и указателя на данные). brankovic показал это весьма убедительно. Так что я могу опираться на итераторы, ссылки и указатели (что мне нравится) для контейнеров которые это поддерживают.
Записан
ритт
Гость
« Ответ #22 : Июль 10, 2011, 21:05 »

далее, std::list - это банальный двунаправленный список - тут и ежу понятно, что удаление произвольной ноды никоим образом не влияет ..
Ежу все понятно - потому у него вместо мозгов иголки Улыбающийся А где гарантия что в конкретной реализации - и.т.п. как Вы недавно рассказывали? Допустим разработчик захотел распределять ноды блоками в целях оптимизации - тогда их перемещение при удалении/вставке вполне возможно.
в двунаправленном списке сами ноды не меняются - меняются только связи между ними. если изменение нод при удалении/вставке вполне возможно, такая реализация списка некорректна.
Записан
Страниц: 1 [2]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.095 секунд. Запросов: 23.