|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Нет наработок или кода, если нужно готовое решение - создайте тему в разделе Фриланс и оплатите работу. Название темы включает слова - "Помогите", "Нужна помощь", "Срочно", "Пожалуйста". Название темы слишком короткое или не отражает сути вашего вопроса. Тема исчерпала себя, помните, один вопрос - одна тема Прочитайте правила и заново правильно создайте тему. |
|
Опции темы | Поиск в этой теме |
29.02.2016, 16:12 | #1 |
Заблокирован
Регистрация: 06.02.2011
Сообщений: 1,999
|
Итератор списка
Добрый день !
Заметил такую опасную ситуацию при выполнении Код:
it_temp уже указывает на элемент списка l а не temp |
29.02.2016, 16:23 | #2 |
Старожил
Регистрация: 12.01.2011
Сообщений: 19,500
|
И в чем опасность? Что вы хотели?
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом. |
29.02.2016, 16:24 | #3 |
Старожил
Регистрация: 28.01.2009
Сообщений: 21,000
|
полный пример можно и какой компилятор.
ибо не должно быть такого, итератор передается поидее по значению, а не ссылке. Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел. Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите. Последний раз редактировалось Пепел Феникса; 29.02.2016 в 16:26. |
29.02.2016, 17:02 | #4 |
Заблокирован
Регистрация: 06.02.2011
Сообщений: 1,999
|
компилятор вижуал 10.
Вообще хотел создать функцию которая перемешивает список. Колода карт к примеру. Для простоты эксперимента список взял типа инт. Перемешиваю таким образом. Делю список на 2 части. Границы раздела определяю с помощью rand(); (функция Код:
далее создаю 2 списка на основании границ раздела полученных от rand_2 и смешиваю как на рисунке. ___________________________ в цикле получил косяк Код:
полный код. малость цикл изменил. запоминаю следующий элемент списка temp за итератором it_temp а потом после выполнения Код:
но мне кажется что есть что-то проще. ___________________________________ Код:
|
01.03.2016, 13:17 | #5 |
Заблокирован
Регистрация: 06.02.2011
Сообщений: 1,999
|
ну так что это логично что
после выполнения Код:
далее делаю it_temp++ it_temp уже указывает на элемент списка l а не temp (* it_temp) это уже элемент из списка l а не temp |
01.03.2016, 15:02 | #6 |
Форумчанин
Регистрация: 22.02.2016
Сообщений: 145
|
Программирование С/С++
Мне кажется, с итератором ничего не должно происходить при изменении контейнера, он просто должен считаться недействительным.
В вашем случае, может быть список разрезали, но элементы никуда не перемещались. Не знаю как работает STL (для меня это тёмный лес), но логично предположить, что управление контейнером с атрибутами должно быть отделено от памяти с данными. Т.е. при разделении контейнера на части, данные не перемещаются. В результате, логическая ошибка технически не проявляется.
Возьму в кредит мильён по 100% годовых на сто лет.
Последний раз редактировалось ProBeginner; 01.03.2016 в 15:09. |
01.03.2016, 16:33 | #7 | |
Вредный кошак
Участник клуба
Регистрация: 14.10.2012
Сообщений: 1,159
|
Пепел Феникса, итератор не изменяется,
но при splice элемент, на который он "указывает" помещается в другой контейнер, соответственно и итератор теперь будет на элемент другого контейнера. Это законное поведение. Цитата:
P.S. Зато Либерти, зато за 21 день... Последний раз редактировалось Croessmah; 01.03.2016 в 16:40. |
|
01.03.2016, 16:45 | #8 |
Форумчанин
Регистрация: 22.02.2016
Сообщений: 145
|
Программирование С++
Итератор не имеет обратной связи с контейнером. Когда контейнер изменяется, итератор становится недействительным. Страуструп предлагает считать итератор ссылкой, а ссылка не может контролировать структуру содержащую элемент на который она ссылается.
Наоборот, контейнер может управлять итератором, но это делается только методами контейнера явно применёнными к итератору. Сам контейнер не контролирует значения итераторов, он их просто не помнит. По этому, когда меняете структуру контейнера, все итераторы должны считаться недействительными.
Возьму в кредит мильён по 100% годовых на сто лет.
|
01.03.2016, 16:54 | #9 |
Форумчанин
Регистрация: 22.02.2016
Сообщений: 145
|
Значением итератора является структура подобная ссылке. Я думаю, Вы перепутали вопрос передачи/возврата параметров в функцию и суть ссылок.
Возьму в кредит мильён по 100% годовых на сто лет.
|
01.03.2016, 17:00 | #10 | |||
Вредный кошак
Участник клуба
Регистрация: 14.10.2012
Сообщений: 1,159
|
Цитата:
Плюс ко всему это list, у него вообще надо постараться чтобы итераторы инвалидировались. Цитата:
Цитата:
|
|||
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Итератор для двусвязного списка | Black_Dynamite | Помощь студентам | 0 | 07.11.2013 22:04 |
итератор set c++ | Arrioh | Помощь студентам | 1 | 25.12.2012 16:01 |
Итератор списка по значению | Link0 | Общие вопросы по Java, Java SE, Kotlin | 0 | 21.11.2010 14:02 |