Pepe 🐸
Возможно поэтому у меня иногда ломается программа
Pepe 🐸
В зависимости от размера массива
Denis
Sergey
В зависимости от размера массива
не всегда итераторы инвалидируются при вставке, есть гарантии отсутсвия инвалидации итераторов у связных списков при некоторых вставках, у вектора при вставке в конец при отсутствии реалокации и т.п. Всё прописано в стандарте, но на это поведение лучше не закладываться
Denis
Aleksei
Denis
В логических выражениях xor довольно редко нужен
Denis
Ссылка на сам объект вектора не инвалидируется
Sergey
Поэтому привыкайте юзать ranges в виде range_v3 :) правда ту же stl всё же нужно проштудировать перед использованием более высокоуровневых аналогов
Denis
Я такие итераторы для дека писал, проблем не было
Gregory
Denis
Gregory
сеть лагает, уже написали что ссылка по сути тоже указатель
Denis
А какая разница?
Gregory
обьекты будут перемещены
Gregory
у них будут новые адреса
Gregory
ссылка будет на старые адреса
Gregory
аа ссылка на сам вектор
Gregory
вообще, вроде как ничто не мешает сделать свой итератор по вектору который работает по принципу ссылка на вектор + offset
Gregory
кто захочет платить за все вытекающие - пожалуйста
Gregory
итераторы такие как они есть из основной идеалогии С++ - не платить за то что тебе ненужно
Sergey
Sergey
обычно, использование указателя на первый элемент вектора - быстрее, чем итераторы
Denis
Sergey
Denis
Нет итератора на вектор, есть сам вектор, который мы объявили, например, на стеке
Denis
Да, держу. Он же не может со стека куда-то убежать?
Denis
Подтверждение того, что объект не может сам изменить свой адрес?
Denis
Типа
delete this;
this = new vector()
Denis
Это даже не скомпилится
Sergey
если _ITERATOR_DEBUG_LEVEL стоит дефолтный - всякие ненужные проверки
Sergey
Gregory
Sergey
Gregory
при том что обсуждался вариант итератора который хранит именно адрес самого вектора и индекс в качестве числа
Gregory
а все операции через обращения по адресу самого вектора
Sergey
Gregory
и тогда типо итератор не инвалидируется
Gregory
ценой конечно косвенных обращений
Gregory
ага )
Sergey
Sergey
Итератор ничего не должен знать про контейнер
Sergey
по описанной вами схеме - да, работало бы.
Gregory
Gregory
А почему они не могли сделать итераторы, не ломающиеся при реаллокации?
Gregory
Казалось бы. это несложно
Gregory
Храним ссылку на вектор и индекс, тут нечего показывать
Gregory
это для тех кто потерял нить
Gregory
и автора )
Sergey
а если вы вектор передали в другую функцию? кто будет обновлять ссылку на вектор у итератора?
Sergey
Sergey
полная копия
Sergey
примерно как доступ по vec[n]
Gregory
ага
Gregory
перемещение вектора это уже другая история
Sergey
В общем, ваше предложение - хранить указатель на вектор в итераторе. Кто будет ответственным за обновления указателя при копировании вектора?
Gregory
Gregory
сейчас если переместить вектор то итераторы не инвалидируются
Gregory
но нафига оно мне надо
Sergey
Так вектор зачастую на стеке создаётся. Ваша ссылка на вектор будет указывать на другой стекфрейм и не факт, что она продолжает быть валидной
Gregory
Gregory
я что их вместе с ним буду перемещать?
Sergey
сейчас я покажу свою мысль
Evgenii
Хм, такой сценарий, у меня два итератора, я добавляю в вектор значения и он реаллоцируется
Evgenii
Инвалидируем итераторы?
Mikhail
если в памяти есть место довыделить память, то итераторами можно будет пользоваться
Mikhail
если нет, то нельзя
Mikhail
но вообще лучше просто всегда считать что они инвалидируются
Крылатый
Товарищи.
Evgenii
Sergey
https://ideone.com/O6hc72
Кем будет обновлён адрес на новый вектор у итератора?
Gregory