Используя std::less_equal
, невозможно узнать, эквивалентны ли два элемента. std::set
использует выражение !comp(a, b) && !comp(b, a)
, чтобы определить, эквивалентны ли a
и b
. Это работает, если вы используете строгий слабый порядок , как std::less
, но не работает, когда вы используете std::less_equal
. 5
и 5
эквивалентны, но !(5 <= 5) && !(5 <= 5)
равен false
. Таким образом, стирание завершается неудачей.
Короче говоря, вы не можете просто превратить набор в мультимножество, используя std::less_equal
.
@ Caleth описал способ использования std::multiset
и выполнение поиска по линейному времени. Вы можете определить порядок в логарифмическом c времени, сохранив порядок для каждого элемента.
template <typename Value>
struct ordered_value {
size_t order;
Value value;
};
template <typename Value>
using ordered_multiset = std::multiset<ordered_value<Value>>;
Проблема в том, что вам нужно обновлять порядок каждый раз, когда вы вставляете или стираете (который является линейным ). Вы уверены, что используемый вами контейнер выполняет операцию в постоянное время? Мне это кажется невозможным.
Способ, которым статистика упорядочения c реализована в красно-черном дереве, на самом деле очень похож. В каждом узле есть некоторая дополнительная информация, которая обновляется при вставке или удалении. Дело в том, что это очень близко к лучшему, что вы можете сделать , не создавая при этом своего собственного красно-черного дерева.