boost::multi_index_container MRU

У меня есть bmi multi_index_container для MRU, определенный следующим образом

bmi::multi_index_container<Item, bmi::indexed_by<bmi::sequenced<>, bmi::hashed_unique<bmi::tag<hashed>, KeyExtractor>>>

На самом деле он основан на примере bmi . После вставки и перемещения элемента в голову все в порядке. Проблема начинается, когда я ищу ключ и извлекаю его следующим образом.

item_type & get(const key_type & key) const
{
    auto item = items.template get<hashed>().find(key);
    if (item == items.template get<hashed>().end())
        throw std::logic_error("Item not found");

    //relocate the item to the head
    return const_cast<item_type &>(*item);
}

Так как я ищу по ключу, я использую хешированный индекс. Тогда я должен вызвать relocate на sequenced но итератор из другого индекса и он конечно не будет работать. Конечно, перебирать sequenced и находить один и тот же элемент — вариант, но довольно уродливый и неэффективный. Есть ли другой способ сделать это?


person kreuzerkrieg    schedule 14.05.2020    source источник
comment
Разве проекция итератора не работает в вашем случае? boost.org/doc/libs/ 1_73_0/libs/multi_index/doc/reference/   -  person Igor R.    schedule 14.05.2020
comment
эй! не знал об этом. сразу проверю   -  person kreuzerkrieg    schedule 14.05.2020
comment
@ИгорьР. это сработало, как и ожидалось. Спасибо! Пожалуйста, преобразуйте свой комментарий в ответ   -  person kreuzerkrieg    schedule 14.05.2020


Ответы (1)


Для преобразования между итераторами разных индексов используйте проекция.

person Igor R.    schedule 14.05.2020