Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Закрытая тема
Ваша тема закрыта, почему это могло произойти? Возможно,
Нет наработок или кода, если нужно готовое решение - создайте тему в разделе Фриланс и оплатите работу.
Название темы включает слова - "Помогите", "Нужна помощь", "Срочно", "Пожалуйста".
Название темы слишком короткое или не отражает сути вашего вопроса.
Тема исчерпала себя, помните, один вопрос - одна тема
Прочитайте правила и заново правильно создайте тему.
 
Опции темы Поиск в этой теме
Старый 01.03.2016, 17:04   #11
RAFA91
Заблокирован
 
Регистрация: 06.02.2011
Сообщений: 1,999
По умолчанию

Цитата:
Сообщение от ProBeginner Посмотреть сообщение
Итератор не имеет обратной связи с контейнером. Когда контейнер изменяется, итератор становится недействительным.
не везде.

в векторе да - - - но тут действителен и указывает уже на элементы

другого контейнера. может оно и верно.

поэтому и пришлось вводить дополнительный итератор, чтобы иметь возможность вновь идти по контейнеру temp

Код:
it = it_temp;
			it++;  // дополнительный итератор
			l.splice(it_l,temp,it_temp);
			it_l++;
			it_temp = it;
RAFA91 вне форума
Старый 01.03.2016, 17:07   #12
ProBeginner
Форумчанин
 
Регистрация: 22.02.2016
Сообщений: 145
По умолчанию

Цитата:
Сообщение от Croessmah Посмотреть сообщение
у него вообще надо постараться чтобы итераторы инвалидировались
Это актуально только для контейнеров типа списка и если элемент на который указывает итератор сохраняется. Если из контейнера элемент удаляется, то итератор не может оставаться действительным, хотя значение как ссылки не изменится.
Вы что, хотите отрезать кусок, но сохранить действительность ссылок?
Возьму в кредит мильён по 100% годовых на сто лет.
ProBeginner вне форума
Старый 01.03.2016, 17:15   #13
RAFA91
Заблокирован
 
Регистрация: 06.02.2011
Сообщений: 1,999
По умолчанию

Цитата:
Сообщение от ProBeginner Посмотреть сообщение
Э
Вы что, хотите отрезать кусок, но сохранить действительность ссылок?
не отрезать а переместить из одной бочки в другую.

переместил итератор в другую бочку - теперь и могу использовать этот

итератор только в ней. это противоречие здравого смысла.
RAFA91 вне форума
Старый 01.03.2016, 17:15   #14
ProBeginner
Форумчанин
 
Регистрация: 22.02.2016
Сообщений: 145
По умолчанию

Цитата:
Сообщение от RAFA91 Посмотреть сообщение
может оно и верно
Не стоит на это рассчитывать. Для итераторов, как для ссылок, можно применять вычитание. Вопрос на засыпку, что будет если вычесть итератор из итератора другого контейнера (в смысле экземпляр а не тип)?
Попробуйте сделать список 1 2 3 4 и два итератора на 2 и 3. Вычтите из одного другой. Потом разрежьте список на 1 2 и 3 4, и снова выполните вычитание.
Возьму в кредит мильён по 100% годовых на сто лет.
ProBeginner вне форума
Старый 01.03.2016, 17:17   #15
Croessmah
Вредный кошак
Участник клуба
 
Аватар для Croessmah
 
Регистрация: 14.10.2012
Сообщений: 1,159
По умолчанию

Цитата:
Это актуально только для контейнеров типа списка и если элемент на который указывает итератор сохраняется.
Может Вы не заметили, но речь в теме ведется
о std::list и его функции-члене splice.
То бишь оба условия выполняются.
Цитата:
Если из контейнера элемент удаляется, то итератор не может оставаться действительным
Если элемент удаляется совсем - да.
В данном случае у нас splice,
а значит элемент перекочует в другой контейнер.
При этом он не будет копироваться или перемещаться,
сам узел будет вырезан из одного контейнера
и вставлен в другой. То есть все итераторы,
которые нацелены на этот узел так и будут на него нацелены,
даже если он в другом контейнере.
Цитата:
Вы что, хотите отрезать кусок, но сохранить действительность ссылок?
Ага. Кусок отрезали и вставили в другое место.
Всё нормально. Перечитайте еще раз
Цитата:
Pointers and references to *i continue to refer to this same element but as a member of *this. Iterators to *i (including i itself) continue to refer to the same element, but now behave as iterators into *this, not into x.
Другими словами, при splice итератор остается валидным
и "указывает" на тот же узел списка.
Но теперь этот узел находится в другом списке.
Это стандартизированное поведение.
Дальнейший спор бессмыслен.

Последний раз редактировалось Croessmah; 01.03.2016 в 17:20.
Croessmah вне форума
Старый 01.03.2016, 17:17   #16
RAFA91
Заблокирован
 
Регистрация: 06.02.2011
Сообщений: 1,999
По умолчанию

Цитата:
Сообщение от ProBeginner Посмотреть сообщение
итератор из итератора другого контейнера .
мне такая дурь в голову не приходила. думаю нечего хорошего от этого не будет.

я всегда пользовался итераторами только из своего контейнера.

Последний раз редактировалось RAFA91; 01.03.2016 в 17:20.
RAFA91 вне форума
Старый 01.03.2016, 17:24   #17
ProBeginner
Форумчанин
 
Регистрация: 22.02.2016
Сообщений: 145
По умолчанию

Цитата:
Сообщение от RAFA91 Посмотреть сообщение
не отрезать а переместить из одной бочки в другую.

переместил итератор в другую бочку - теперь и могу использовать этот

итератор только в ней. это противоречие здравого смысла.
правильно, старые итераторы д.б. недействительны после перемещения, но т.к. реального перемещения элементов в памяти не происходит, то старые итераторы продолжают указывать на эти элементы т.к. никто не стирал в этих итераторах значения адресов памяти. Другой вопрос, что будет, если без повторной инициализации, использовать эти итераторы для дальнейших манипуляций? М.б. так, что манипулятор содержит две ссылки: на элемент контейнера и на сам контейнер. При такой реализации, действия с манипулятором разрушат вообще все данные. К сожалению, я сам книжку не понял да и забыл уже
Возьму в кредит мильён по 100% годовых на сто лет.
ProBeginner вне форума
Старый 01.03.2016, 18:12   #18
RAFA91
Заблокирован
 
Регистрация: 06.02.2011
Сообщений: 1,999
По умолчанию

в основном чудес можно ждать от итератора вектора когда вставляем или удаляем элемент.
список в этом плане не капризный.
RAFA91 вне форума
Старый 01.03.2016, 19:16   #19
Croessmah
Вредный кошак
Участник клуба
 
Аватар для Croessmah
 
Регистрация: 14.10.2012
Сообщений: 1,159
По умолчанию

Цитата:
в основном чудес можно ждать от итератора вектора когда вставляем или удаляем элемент.
Никаких чудес. Поведение декларировано однозначно.
Если Вы с ним не знакомы, это не значит, что это чудо!
Croessmah вне форума
Старый 02.03.2016, 12:42   #20
RAFA91
Заблокирован
 
Регистрация: 06.02.2011
Сообщений: 1,999
По умолчанию

я с итераторами вектора имел дело.

так вот там при вставке обьекта , происходит перезапись всего контейнера.

поэтому функция вставки возвращает итератор уже на обновленный контейнер.
RAFA91 вне форума
Закрытая тема


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Итератор для двусвязного списка 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