Size: a a a

2020 September 03

AP

Antony Polukhin in pro.cxx
Casual tears
А как определяется "сразу"? Насколько мне известно в атомиках всё держится на "happens before".
И на rmw операциях
https://eel.is/c++draft/intro.multithread#intro.races-5 - только для rmw
источник

AP

Antony Polukhin in pro.cxx
BTW, пока тут готовился к митапу, почувствовал острую необходимость иметь в стандарте C++ container::iterator_to(T& reference_to_an_element_in_container), как это сделано в Boost.Intrusive

Кому-то (кроме меня) будет полезен такой метод?
источник

CD

Constantine Drozdov in pro.cxx
А зачем?
источник

CD

Constantine Drozdov in pro.cxx
Ссылка просто более слабая форма гарантий, чем итератор, зачем их отождествлять?
источник

AP

Antony Polukhin in pro.cxx
Чтобы имея ссылку на значение из контейнера, за O(1) получать итератор

Ну и итераторы инвалидируются, даже если указатели на элементы - нет (например у всех unordered_* контейнеров так)
источник

CD

Constantine Drozdov in pro.cxx
Antony Polukhin
Чтобы имея ссылку на значение из контейнера, за O(1) получать итератор

Ну и итераторы инвалидируются, даже если указатели на элементы - нет (например у всех unordered_* контейнеров так)
А с другой стороны - эта операция корректна в достаточно узких условиях (скажем, некорректна для дебажного вектора, который должен диапазоны итераторов проверять)
источник

CD

Constantine Drozdov in pro.cxx
Возможно, если unordered_* может такое преобразование выполнить, это просто неправильная гарантия итератора?
источник

ПК

Побитый Кирпич... in pro.cxx
Antony Polukhin
Чтобы имея ссылку на значение из контейнера, за O(1) получать итератор

Ну и итераторы инвалидируются, даже если указатели на элементы - нет (например у всех unordered_* контейнеров так)
Что то не пойму как получить за O(1), если это не вектор и не хэш таблица.
источник

CD

Constantine Drozdov in pro.cxx
Побитый Кирпич
Что то не пойму как получить за O(1), если это не вектор и не хэш таблица.
Все могут при определенных шаманствах (деке, правда, alignment аллока нужен будет)
источник

AP

Antony Polukhin in pro.cxx
Constantine Drozdov
Все могут при определенных шаманствах (деке, правда, alignment аллока нужен будет)
Да, с deque, кажется что получится только за линейное время (но быстрее чем через std::find)
источник

CD

Constantine Drozdov in pro.cxx
Antony Polukhin
Да, с deque, кажется что получится только за линейное время (но быстрее чем через std::find)
Чуть лучше, если сделать специальный - можно либо aligned alloc на блок использовать, либо заголовки элементам вписать
источник

CD

Constantine Drozdov in pro.cxx
Antony Polukhin
Чтобы имея ссылку на значение из контейнера, за O(1) получать итератор

Ну и итераторы инвалидируются, даже если указатели на элементы - нет (например у всех unordered_* контейнеров так)
Возможно, это специальная операция для случая "итераторы инвалидируются, даже если указатели на элементы - нет"?
источник

CD

Constantine Drozdov in pro.cxx
И нужно ввести новую форму итераторов - неинвалидируемые?
источник

V

Vyacheslav in pro.cxx
Antony Polukhin
Чтобы имея ссылку на значение из контейнера, за O(1) получать итератор

Ну и итераторы инвалидируются, даже если указатели на элементы - нет (например у всех unordered_* контейнеров так)
Так элементы в таких контейнерах могут муваться (но там они списком хранятся). Как потом ключ восстанавливать, если не ясно, куда элемент ушёл? Там как раз для этого тип node завели
источник

V

Vyacheslav in pro.cxx
Ну и если нужен итератор, а он инвалидируется - это намёк на то, что для решения задачи выбран не лучший контейнер
источник

AP

Antony Polukhin in pro.cxx
ну да, предусловие - ссылка валидная

Понадобилось мне для кейса, где в value для unordered_map лежит нода intrusive list. Нужно было из intrusive list получить ноду, и из ноды - итератор на это значение в мапе

так вот, итератор можно было получить только через find, а это дорого (надо хешировать ключ и искать в мапе)
источник

AP

Antony Polukhin in pro.cxx
* так что итератор там не сохраняется в принципе, есть только ссылка на значение, и то получается она вычислениями
источник

АР

Андрей Руссков... in pro.cxx
хм. А реально добавить методы вида std::map::iterator_from_value(const Val& value); ?
источник

AP

Antony Polukhin in pro.cxx
Реально

Там может быть немного UB, но разработчики стандартной библиотеки знают как его победить для их компилятора
источник

АР

Андрей Руссков... in pro.cxx
проползал существует?
источник