170 похожих чатов

Я не очень понял, как работают правила инвалидации итераторов и

указателей в случае контейнеров STL (конкретней, std::deque). У меня такой вопрос: если операция была неуспешной, т.е. сработало исключение типа T, то ведь по стандарту контейнер останется неизменным, а значит, инвалидаций не будет?

33 ответов

42 просмотра

Это надо прочитать в документации на конкретную операцию

Nickolay-Garbuzov Автор вопроса
Ilya Zviagin
Это надо прочитать в документации на конкретную оп...

Ну, например, возьмём вот эту: https://en.cppreference.com/w/cpp/container/deque/operator%3D

Nickolay-Garbuzov Автор вопроса
Ilya Zviagin
Это надо прочитать в документации на конкретную оп...

https://stackoverflow.com/questions/11699083/where-can-i-find-all-the-exception-guarantees-for-the-standard-containers-and-al Тут что-то невразумительное. Вообще ничего не сказано про инвалидацию не swap-ом.

Nickolay Garbuzov
Ну, например, возьмём вот эту: https://en.cpprefer...

А что там можно написать про итераторы или указатели?

Nickolay Garbuzov
Ну, например, возьмём вот эту: https://en.cpprefer...

Что, как ты думаешь, делает оператор = ?

Nickolay-Garbuzov Автор вопроса
Ilya Zviagin
Что, как ты думаешь, делает оператор = ?

Пользователю нужно скопировать данные одного дека внутрь другого. Если операция каким-то образом не удалась, возникает вопрос, правда ли, что всё осталось на месте, а итераторы сломались. Ну вдруг дек прыгнул в другое место памяти, а потом решил там остаться и удалить свои старые данные.

Nickolay Garbuzov
Пользователю нужно скопировать данные одного дека ...

А с какого перепуга что-то должно ломаться в исходном, не модифицируемом контейнере?

Nickolay-Garbuzov Автор вопроса
Ilya Zviagin
А с какого перепуга что-то должно ломаться в исход...

Тот, кого присваиваем, не должен. Я не про него.

Nickolay Garbuzov
Тот, кого присваиваем, не должен. Я не про него.

А тот КОМУ присваиваем, наоборот, гарантированно должен весь поменяться

Nickolay-Garbuzov Автор вопроса

Так, о чём я спрашиваю?

Nickolay Garbuzov
Так, о чём я спрашиваю?

Ты бред какой-то спрашиваешь

Nickolay-Garbuzov Автор вопроса
Ilya Zviagin
Ты бред какой-то спрашиваешь

Почему бред-то? Странный вопрос?

Nickolay-Garbuzov Автор вопроса
Ilya Zviagin
Бредовый. Попробуй ещё раз.

Окей. Коротко сформулирую: если оператор присваивания не сработал, итераторы не инвалидируются? Y/N?

Nickolay-Garbuzov Автор вопроса
Ilya Zviagin
Итераторы на какой объект?

Произвольный элемент типа T контейнера.

Nickolay Garbuzov
Произвольный элемент типа T контейнера.

Блять, оператору = нужно два объекта, какого объекта итераторы тебя интересуют?

Nickolay-Garbuzov Автор вопроса
Ilya Zviagin
Блять, оператору = нужно два объекта, какого объ...

Я же писал тут, про кого я!! https://t.me/supapro/1065622

Nickolay Garbuzov
Тот, кого присваиваем, не должен. Я не про него.

Один ты присваиваешь, другой константный. Че не ясно?

Nickolay-Garbuzov Автор вопроса
Ilya Zviagin
Один ты присваиваешь, другой константный. Че не ...

Какой же он к чёрту константный, если я ему присваиваю??

Ilya Zviagin
Один ты присваиваешь, другой константный. Че не ...

Ему неясно, что произойдет если при присваивании константного "другому" произойдет ошибка. Итераторы не-константного инвалидируются или нет?

Nickolay-Garbuzov Автор вопроса
Vladimir
Ему неясно, что произойдет если при присваивании к...

При чём тут константные типы??? Я не писал такое слово, откуда вы его взяли?

Nickolay Garbuzov
При чём тут константные типы??? Я не писал такое с...

Тот, который вы присваеваете - "константный" в том смысле, что мы его никак не изменяем. Тот, которому присваем - очевидно, изменяется

Nickolay-Garbuzov Автор вопроса
Vladimir
Тот, который вы присваеваете - "константный" в том...

С точки зрения метода, ДА, он имеет тип константной ссылки, но прошу меня так не путать больше.

Nickolay-Garbuzov Автор вопроса
Vladimir
Ему неясно, что произойдет если при присваивании к...

Да, именно это я и спрашивал. Неясно, почему пришлось столько времени объяснять.

Nickolay Garbuzov
Почему бред-то? Странный вопрос?

Там написано про гарантии, вот Notes After container move assignment (overload (2)), unless element-wise move assignment is forced by incompatible allocators, references, pointers, and iterators (other than the end iterator) to other remain valid, but refer to elements that are now in *this. The current standard makes this guarantee via the blanket statement in [container.requirements.general]/12, and a more direct guarantee is under consideration via LWG 2321.

Nickolay-Garbuzov Автор вопроса
Vladimir
Ему неясно, что произойдет если при присваивании к...

Про это — ничего не сказано, значит, гарантий нет.

Nickolay Garbuzov
Это мувающий оператор =

Про остальные — ничего не сказано.

Nickolay Garbuzov
С точки зрения метода, ДА, он имеет тип константно...

Дык то сообщение вообще Илье адресовалось. Вообще, касательно вашего вопроса, следует смотреть "стандарт" по определенному методу. Для insert deque пишут, например Exceptions If an exception is thrown when inserting a single element at either end, this function has no effect (strong exception guarantee). В остальных случаях гарантий нет.

Nickolay-Garbuzov Автор вопроса
Vladimir
Дык то сообщение вообще Илье адресовалось. Вообще,...

Дык непонятно, распространяется ли этот ваш no effect на инвалидацию итераторов или нет.

Nickolay Garbuzov
Дык непонятно, распространяется ли этот ваш no eff...

has no effect это буквально ничего не произошло, контейнер не изменился

Nickolay-Garbuzov Автор вопроса
Vladimir
has no effect это буквально ничего не произошло, к...

Окей, всем спасибо. Сегодня мы узнали, что no effect включает гарантию оставления итераторов валидными, а про копирующий operator= дека в стандарте пусто.

Похожие вопросы

Обсуждают сегодня

Какой-то там пердун в 90-х решил, что есть какая-то разная типизация. Кого вообще это волнует?
КТ315
49
void terminal_scroll() { memmove(terminal_buffer, terminal_buffer + VGA_WIDTH, buffer_size - VGA_WIDTH); memset(terminal_buffer + buffer_size - VGA_WIDTH, 0, VGA_WIDTH); ...
Егор
47
Всем привет! Подскажите, пожалуйста, в чем ошибка? Настраиваю подключение к MySQL. Либы лежат рядом с exe. Все как по "учебнику"
Евгений
16
А можете как-то проверить меня по знаниям по ассемблеру?
A A
132
Здравствуйте! У меня появилась возможность купить книгу "Изучай Haskell во имя добра!". Но я где-то слышал, что эта книга устарела. Насколько это правда??
E
22
Здравствуйте! Я вот на stepic решаю задачи на хаскеле https://stepik.org/lesson/8443/step/8?unit=1578 мой код import Data.List (isInfixOf) removing :: String -> [String] ->...
E
10
Камрады, кто тесно работал с vtv, хотел уточнить. Ширина column задаётся жёстко на этапе создания дерева или можно в рантайме ее менять программно (не мышкой)?
Ed Doc
10
да ладно ... что там неочевидного ? глянуть в исх-ки датасета и/или кверика чтобы понять в каком месте и как выполняется обращения к св-вам blablaSQL - минутное дело, даже е...
Сергей
7
Здесь для arm кто-нибудь кодит ?
Nothing
52
Всем привет, у меня есть сервер принимающий входящие HTTP подключения, как проверить, что подключение было через прокси или нет, есть какие то поля в заголовках по которым мо...
Кибер Бомж
8
Карта сайта