Можем ли мы использовать boost::multi_index::multi_index_container в качестве мультииндексной карты?

Я использую boost::multi_index::multi_index_container‹> из библиотеки boost.

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

Можем ли мы изменить этот контейнер, чтобы использовать мультикарту, а также он будет использоваться как мультииндексный контейнер?


person BSalunke    schedule 30.03.2015    source источник


Ответы (1)


Конечно.

Однако сначала посмотрите на Boost Bimap, так как он уже делает то, что вы описываете:

Я привел пример того, как использовать Boost Multi Index для эмуляции карты здесь:

Соответствующий тип оборудования выглядит следующим образом:

namespace emulation {
    template <typename T1,typename T2,typename Alloc>
        struct mutable_pair
        {
            typedef T1 first_type;
            typedef T2 second_type;

            mutable_pair(Alloc alloc):first(T1(alloc)),second(T2(alloc)){}
            mutable_pair(const T1& f,const T2& s):first(f),second(s){}
            mutable_pair(const std::pair<T1,T2>& p):first(p.first),second(p.second){}

            T1         first;
            mutable T2 second;
        };

    using namespace boost::multi_index;

    template <typename Key, typename T, typename Compare, typename Allocator, typename Element = mutable_pair<Key, T, Allocator> >
        using map = multi_index_container<
            Element,
            indexed_by<
                ordered_unique<member<Element,Key,&Element::first>,Compare>
            >,
            typename Allocator::template rebind<Element>::other
        >;

  template <typename Key, typename T, typename Compare, typename Allocator, typename Element = mutable_pair<Key, T, Allocator> >
    using multimap = multi_index_container<
        Element,
        indexed_by<
            ordered_non_unique<member<Element,Key,&Element::first>,Compare>
        >,
        typename Allocator::template rebind<Element>::other
    >;
}

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

person sehe    schedule 30.03.2015
comment
спасибо за описательный и полезный ответ. Однако я застрял в эмуляции ассоциативного контейнера карты. Я попытался эмулировать карту, которая содержит ключ и значение в виде набора boost:shared_ptr‹›. - person BSalunke; 31.03.2015
comment
@BSalunke, возможно, вам следует опубликовать еще один вопрос, показывающий SSCCE того, где вы застряли. - person sehe; 31.03.2015