Почему нету lower_bound и upper_bound для unordered_multimap? - PullRequest
0 голосов
/ 18 марта 2019

Переключаясь с мультикарты на unordered_multimap, я понял, что нет эквивалента:

  • lower_bound
  • upper_bound

Кажется очевидным, чтоequal_range может быть простым эквивалентом, но мне интересно, если я что-то упустил: причина этого выбора.

Исходя из любой другой библиотеки, я бы счел эту разницу простой ошибкой, но STL обычно в этом отношении довольно ортогональн.

Ответы [ 2 ]

8 голосов
/ 18 марта 2019

Это во имя. неупорядоченный _multimap.Там нет порядка, и, как таковой, нет нижнего / верхнего отношения.Элементы (ключи), хранящиеся в unordred_* контейнерах, даже не требуются для реализации < / std::less, только операции хеширования и равенства.

2 голосов
/ 18 марта 2019

Если вы посмотрите на std::lower_bound() и std::upper_bound() документацию, вы увидите, что они предъявляют особые требования к диапазону, к которому они могут применяться:

Диапазон [first, last) должен быть разбит на части по отношению к выражению! (Value

Поскольку std::map удовлетворяет этому критерию, можно использовать эти обобщенные функции на нем, но такое использование неэффективно, так как эти обобщенные функции не знают о внутреннем представлении.карты.Так что std::map предоставил свои, более эффективные варианты (хотя и менее общие).std::unordered_map с другой стороны не удовлетворяет критерию, поэтому вы не можете применять эти обобщенные функции к нему, и поэтому не имеет смысла реализовывать их для самого std::unorderd_map.

Я, хотя lower_boundвозвращает первый итератор с заданным ключом, это может быть возможно для неупорядоченного контейнера.

Это то, что делает std::find().std::lower_bound() или std::map::lower_bound() дает вам позицию, из которой элементы диапазона не меньше, чем клавиша.Тот факт, что вы можете использовать его для поиска определенного элемента, является полезным побочным эффектом такого поведения, но не является основной целью этих функций.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...