Повышение мульти_индекса упорядоченного_уникального медианного значения

Я хотел бы быстро получить медианное значение из контейнера boost multi_index с индексом order_unique, однако итераторы индекса не имеют произвольного доступа (я не понимаю, почему они не могут быть, хотя это согласуется с std::set ...).

Есть ли более быстрый/аккуратный способ сделать это, кроме увеличения итератора container.size()/2 раза?


person James    schedule 15.05.2010    source источник
comment
std::set использует двунаправленные итераторы. cplusplus.com/reference/std/iterator/BidirectionalIterator   -  person pmr    schedule 16.05.2010
comment
@pmr: точно, ты не можешь сделать iter + 100, только iter++ или iter--;   -  person James    schedule 16.05.2010
comment
Я думаю, что я неправильно прочитал ваше заявление, извините :)   -  person pmr    schedule 16.05.2010


Ответы (2)


Я столкнулся с той же проблемой в другом контексте. Кажется, что STL и Boost не предоставляют упорядоченный контейнер, который имеет произвольный доступ для использования упорядочения (например, для сравнения).

Мое (не очень красивое) решение состояло в том, чтобы использовать класс, который выполнял ввод и «фильтровал» его в наборе. После завершения операции ввода он просто копировал все итераторы набора в вектор и использовал его для произвольного доступа.

Это решение работает только в очень ограниченном контексте: вы выполняете ввод в контейнер один раз. Если вы снова измените добавление в контейнер, все итераторы придется копировать снова. Это действительно было очень неуклюже в использовании, но работало.

person pmr    schedule 15.05.2010

Boost.MultiIndex предоставляет индексы произвольного доступа, но эти индексы не заботятся напрямую ни о каком порядке. Однако вы можете отсортировать этот индекс, используя функцию члена sort, после вставки нового элемента, чтобы вы могли эффективно получить медиану.

Кажется, вы должны сделать запрос к Boost.MultiIndex, чтобы вставка могла быть выполнена с использованием заказа напрямую, так как это должно быть намного эффективнее.

person Vicente Botet Escriba    schedule 16.05.2010
comment
В связи с этим Boost 1.59 будет включать так называемые ранжированные индексы, которые предоставляют альтернативу запросу ОП. - person Joaquín M López Muñoz; 29.05.2015