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

Гарантируется ли что map рассматривает возможность наличия в ней нескольких

ключей типа Key, эквивалентных некоторому значению типа T?

16 ответов

23 просмотра

https://en.cppreference.com/w/cpp/container/multimap

Глянул libcxx, для transparent разруливается на equal_range unique/multi. Но там не чистый lower/upper, там спуск, если попали на равный, то lower/upper от него, т.к. обе границы на ветке. В libstc++ так же, но unique похоже не выделен, просто общий код для map/multimap. А вот для transparent там всё странно, один спуск и поиск конца итерацией...

Посмотрел в msvc, общий код для map/multimap, key_type/transparent. Т.е. тоже допускает множественность. Хотя формально не сказано, получается таки имплементации учитывают что порядок может быть слабее чем key_compare, в libcxx так прям явно: https://github.com/llvm-mirror/libcxx/blob/master/include/map#L1452 Ну и как раз за счёт того что для key_type выделена _unique версия получается разница: https://godbolt.org/z/sT8c1f

Dmitry Sokolov
Посмотрел в msvc, общий код для map/multimap, key_...

В стандарте написано четко, что надо вернуть пару из lower/upper bound.

Constantine Drozdov
В стандарте написано четко, что надо вернуть пару ...

Ну если компаратор транзитивный, так оно и есть. И если он транзитивный, то для map он не может вернуть более одного элемента (если сравнение по key_type).

Dmitry Sokolov
Ну если компаратор транзитивный, так оно и есть. И...

Аргумент для equal_range transparent не компаратор, а специальный

Constantine Drozdov
Аргумент для equal_range transparent не компаратор...

Там отдельные имплементации ж в любом случае, по произвольному ключу запрещено для не transparent. Ну и в libcxx соптимизировали по ключу для map.

Constantine Drozdov
Аргумент для equal_range transparent не компаратор...

Так то можно например написать transparent comparator для пар который заодно сможет сравнивать по first. И через equal_range(FirstType) получать диапазоны с одинаковым key.first.

Dmitry Sokolov
Так то можно например написать transparent compara...

Можно еще в этом случае компаратор, выдающий нетранзитивное равенство, использовать :)

Dmitry Sokolov
Так то можно например написать transparent compara...

есть такая известная в узких кругах штука max(lhs.second, lhs.first + rhs.second) <=> max(rhs.second, rhs.first + lhs.second)

Constantine Drozdov
Можно еще в этом случае компаратор, выдающий нетра...

Ну и вот поиск upper_bound итерацией это мне кажется баг: https://github.com/gcc-mirror/gcc/blob/master/libstdc%2B%2B-v3/include/bits/stl_tree.h#L1407 Может я например разложил числа типа четные налево, нечетные направо и через equal_range получаю диапазоны чётный/нечётный. Это ж половину дерева придется обойти.

Dmitry Sokolov
Ну и вот поиск upper_bound итерацией это мне кажет...

хм... а это не сломается уже на нормальном запросе transparent компаратора для мультимапы из одинаковых элементов?

Constantine Drozdov
хм... а это не сломается уже на нормальном запросе...

Не, там по сравнениям то смысл тот же самый что и в upper_bound.

Dmitry Sokolov
Не, там по сравнениям то смысл тот же самый что и ...

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

Андрей-Руссков Автор вопроса
Dmitry Sokolov
Ну и вот поиск upper_bound итерацией это мне кажет...

при этом по идее стандарт гарантирует ассимптотику операций )

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

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

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Гайс, вопрос для разносторонее развитых: читаю стрим с юарта, нада выделять с него фреймы с определенной структурой, если ли чо готовое, или долбаться с ринг буффером? нада у...
Vitaly
9
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
длина пакета фиксированная, или меняется?
Okhsunrog
7
Карта сайта