Спецификация C++ не дает конкретной реализации для std::multimap
, а вместо этого дает требования к тому, насколько быстрыми должны быть операции с std::multimap
и какие гарантии должны соблюдаться для этих операций. Например, insert
на multimap
необходимо вставить пару ключ/значение в multimap
и сделать это таким образом, чтобы он шел после всех существующих записей с тем же ключом. Это должно сработать за время O(log n) и, в частности, амортизировать O(1), если вставка происходит с подсказкой, а подсказка находится прямо перед тем, куда должен идти элемент. Только с этой информацией multimap
может работать, имея красно-черное дерево со многими узлами, по одному на ключ, или это может быть красно-черное дерево, хранящее vector
значений для каждого ключа. (Однако это исключает дерево AVL, потому что повороты, связанные с вставкой дерева AVL, не выполняются за амортизированное время O (1). Однако это также допускает такие вещи, как деревья 2-3-4 или детерминированные списки пропусков).
Однако по мере того, как мы добавляем новые требования, некоторые реализации исключаются. Например, операция erase
должна выполняться в амортизированное постоянное время, если элементу для стирания задан итератор. Это исключает использование одного узла с ключом и vector
значений, но не исключает одного узла с ключом и двусвязным списком значений. Тип iterator
должен иметь возможность разыменовывать тип value_type
, который должен соответствовать базовому типу allocator
value_type
. Это исключает возможность того, что у вас могут быть отдельные узлы в красно-черном дереве с одним ключом и связанным списком значений, поскольку таким образом вы не сможете получить ссылку на value_type
.
В целом ограничения таковы, что одна допустимая реализация — это красно-черное дерево с одним узлом на пару ключ/значение, хотя возможны и другие варианты. Другие идеи, такие как использование дерева AVL или объединение значений для данного ключа в vector
или list
, невозможны.
Надеюсь это поможет!
person
templatetypedef
schedule
23.01.2015
map
сvector
ключами илиmultimap
? На самом деле это совсем другие вопросы. - person templatetypedef   schedule 23.01.2015