Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

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

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


Донат для форума - использовать для поднятия настроения себе и модераторам

А ещё здесь можно купить рекламу за 25 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru

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

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

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

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

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

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

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

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

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

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

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

Цитата:
Это актуально только для контейнеров типа списка и если элемент на который указывает итератор сохраняется.
Может Вы не заметили, но речь в теме ведется
о 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 в 18:20.
Croessmah вне форума  
Старый 01.03.2016, 18:17   #16
RAFA91
Заблокирован
 
Регистрация: 06.02.2011
Сообщений: 1,999
Репутация: -101
По умолчанию

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

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

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

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

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

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

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

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

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

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

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

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

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


13:55.


Powered by vBulletin® Version 3.8.11
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.