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