@ProCxx

Страница 675 из 2477
Сергей
17.03.2017
13:31:07
Наверно я не понимаю как оно работает.
нужно почитать про устройство stl :)

Pepe
17.03.2017
13:31:16
Возможно поэтому у меня иногда ломается программа

В зависимости от размера массива

Aldar
17.03.2017
13:32:40
Кто сказал?
я, для bool точно нету xor оператора

Google
Denis
17.03.2017
13:33:04
Сергей
17.03.2017
13:33:58
В зависимости от размера массива
не всегда итераторы инвалидируются при вставке, есть гарантии отсутсвия инвалидации итераторов у связных списков при некоторых вставках, у вектора при вставке в конец при отсутствии реалокации и т.п. Всё прописано в стандарте, но на это поведение лучше не закладываться

Aldar
17.03.2017
13:34:50
>>> True ^ True False
да, но xor оператора нет, а and, or, not есть. Это я имел ввиду

Denis
17.03.2017
13:35:27
да, но xor оператора нет, а and, or, not есть. Это я имел ввиду
Его легко реализовать при помощи уже существующих

Aleksei
17.03.2017
13:35:43
Denis
17.03.2017
13:36:02
В логических выражениях xor довольно редко нужен

Denis
17.03.2017
13:37:36
Проблема, что ссылка инвалидируется тоже
Ссылка на сам объект вектора не инвалидируется

Alexander
17.03.2017
13:37:39
Так как под капотом это всё равно указатель

Сергей
17.03.2017
13:37:47
Поэтому привыкайте юзать ranges в виде range_v3 :) правда ту же stl всё же нужно проштудировать перед использованием более высокоуровневых аналогов

Denis
17.03.2017
13:38:33
Я такие итераторы для дека писал, проблем не было

Gregory
17.03.2017
13:38:45
Ссылка на сам объект вектора не инвалидируется
кто то только что пристрелился ?

Google
Gregory
17.03.2017
13:40:14
сеть лагает, уже написали что ссылка по сути тоже указатель

Denis
17.03.2017
13:40:29
А какая разница?

Alexander
17.03.2017
13:40:33
Ссылка на сам объект вектора не инвалидируется
Извините, но я не верю в это. Можно ссылку для Просвещения?

Gregory
17.03.2017
13:40:38
обьекты будут перемещены

у них будут новые адреса

Denis
17.03.2017
13:40:56
обьекты будут перемещены
Объекты будут, вектор не будет

Gregory
17.03.2017
13:41:04
ссылка будет на старые адреса

Alexander
17.03.2017
13:41:20
Gregory
17.03.2017
13:41:24
аа ссылка на сам вектор

Alexander
17.03.2017
13:41:33
Я сейчас кое-что гляну

Gregory
17.03.2017
13:44:13
вообще, вроде как ничто не мешает сделать свой итератор по вектору который работает по принципу ссылка на вектор + offset

кто захочет платить за все вытекающие - пожалуйста

итераторы такие как они есть из основной идеалогии С++ - не платить за то что тебе ненужно

Сергей
17.03.2017
13:47:44
вообще, вроде как ничто не мешает сделать свой итератор по вектору который работает по принципу ссылка на вектор + offset
RandomAccessIterator у std::vector так и работает, причем у некоторых стандартных алгоритмов имеются соответствующие перегрузки на этот tag

Sergey
17.03.2017
13:48:15
обычно, использование указателя на первый элемент вектора - быстрее, чем итераторы

Alexander
17.03.2017
13:48:38
If a reallocation happens, all iterators, pointers and references related to the container are invalidated. Otherwise, only those pointing to position and beyond are invalidated, with all iterators, pointers and references to elements before position guaranteed to keep referring to the same elements they were referring to before the call.

Google
Denis
17.03.2017
13:48:49
итераторы такие как они есть из основной идеалогии С++ - не платить за то что тебе ненужно
Таки list::splice от 3 итераторов за О(n) работает, так что аргумент сомнительный

Alexander
17.03.2017
13:48:56
Ну вот где из этого вытекает, что итератор на сам вектор не инвалидируется - непонятно

Я не могу найти подтверждение слов Дениса

Denis
17.03.2017
13:49:33
Ну вот где из этого вытекает, что итератор на сам вектор не инвалидируется - непонятно
Нет итератора на вектор, есть сам вектор, который мы объявили, например, на стеке

Alexander
17.03.2017
13:49:47
Denis
17.03.2017
13:50:02
Да, держу. Он же не может со стека куда-то убежать?

Alexander
17.03.2017
13:50:20
я прекрасно понимаю твою мысль, пойми) Я не могу найти подстверждения твоим словам

Denis
17.03.2017
13:50:44
Подтверждение того, что объект не может сам изменить свой адрес?

Типа delete this; this = new vector()

Это даже не скомпилится

Alexander
17.03.2017
13:51:32
Sergey
17.03.2017
13:52:19
очень очень сомнительно
ну раз сомнительно - смотрите исходники

если _ITERATOR_DEBUG_LEVEL стоит дефолтный - всякие ненужные проверки

Gregory
17.03.2017
13:55:12
Gregory
17.03.2017
13:56:19
при том что обсуждался вариант итератора который хранит именно адрес самого вектора и индекс в качестве числа

а все операции через обращения по адресу самого вектора

Сергей
17.03.2017
13:57:04
при том что обсуждался вариант итератора который хранит именно адрес самого вектора и индекс в качестве числа
адрес вектора никак не коррелирует с адресом начала данных, который можно получить через vector::data()

Google
Gregory
17.03.2017
13:57:10
и тогда типо итератор не инвалидируется

ценой конечно косвенных обращений

Alexander
17.03.2017
13:57:55
адрес вектора никак не коррелирует с адресом начала данных, который можно получить через vector::data()
именно. Но по адресу самого векотора мы получаем обьект. Потом из обьекта мы вытягиваем data(), поотом прибавляем offset

Gregory
17.03.2017
13:58:24
ага )

Sergey
17.03.2017
13:58:44
при том что обсуждался вариант итератора который хранит именно адрес самого вектора и индекс в качестве числа
опять же, посмотрите исходники. итератор "из коробки" - запоминает прямо указатель на сами данные

Sergey
17.03.2017
13:59:04
по описанной вами схеме - да, работало бы.

Alexander
17.03.2017
13:59:42
Итератор ничего не должен знать про контейнер
мы сейчас говорим про итератор именно для вектора, так что этот довод не подходит здесь

Admin
ERROR: S client not available

Gregory
17.03.2017
14:00:49
А почему они не могли сделать итераторы, не ломающиеся при реаллокации?

Казалось бы. это несложно

Храним ссылку на вектор и индекс, тут нечего показывать

это для тех кто потерял нить

и автора )

Сергей
17.03.2017
14:01:46
мы сейчас говорим про итератор именно для вектора, так что этот довод не подходит здесь
а если вы вектор передали в другую функцию? кто будет обновлять ссылку на вектор у итератора?

Sergey
17.03.2017
14:02:24
полная копия

примерно как доступ по vec[n]

Google
Gregory
17.03.2017
14:03:05
ага

Gregory
17.03.2017
14:05:15
перемещение вектора это уже другая история

Сергей
17.03.2017
14:05:25
не совсем понял.
В общем, ваше предложение - хранить указатель на вектор в итераторе. Кто будет ответственным за обновления указателя при копировании вектора?

Gregory
17.03.2017
14:06:22
Gregory
17.03.2017
14:07:27
сейчас если переместить вектор то итераторы не инвалидируются

но нафига оно мне надо

Сергей
17.03.2017
14:07:48
ссылки* Но это не так важно. А зачем её обновлять при копировании? При копировании итераторы всё равно будут указывать на исходный вектор
Так вектор зачастую на стеке создаётся. Ваша ссылка на вектор будет указывать на другой стекфрейм и не факт, что она продолжает быть валидной

Alexander
17.03.2017
14:08:23
Так, смотрите:

Gregory
17.03.2017
14:09:03
я что их вместе с ним буду перемещать?

Alexander
17.03.2017
14:09:32
std::vector<int> vec; auto it = vec.begin(); auto vec2 = vec; И какое отношение имеет итератор it к vec2?

Evgeniy
17.03.2017
14:10:53
Хм, такой сценарий, у меня два итератора, я добавляю в вектор значения и он реаллоцируется

Инвалидируем итераторы?

Mikhail
17.03.2017
14:12:26
Инвалидируем итераторы?
В лучшем случае нет, в худшем да

если в памяти есть место довыделить память, то итераторами можно будет пользоваться

если нет, то нельзя

но вообще лучше просто всегда считать что они инвалидируются

Gregory
17.03.2017
14:14:58
Инвалидируем итераторы?
в теккщих итераторах - да, в предлагаемых - нет

Дед Пегас
17.03.2017
14:15:37
Товарищи.

Страница 675 из 2477