Как в boost::multi_index
От: nen777w  
Дата: 29.04.08 10:19
Оценка:
В контейнере:

    //key extractor
    struct  extractor_PGWindowID
    {
        typedef unsigned result_type;
        PGINLINE result_type operator()( const PGWindow* wnd ) const
        {
            return wnd->get_id();
        }
    };

    //element modifier
    struct modifer_PGWindow
    {
        modifer_PGWindow( const PGWindow* new_value ) : value( new_value ) {}
        void operator()(PGWindow*& wnd)
        {
            wnd = const_cast<PGWindow*>(value);
        }
    private:
        const PGWindow* value;
    };

    //tags
    struct PGWINDOW_ID{};
    struct PGWINDOW_SEQ{};

    //container type
    typedef boost::multi_index_container<
        PGWindow*, //element
        boost::multi_index::indexed_by<
            boost::multi_index::ordered_unique<
                boost::multi_index::tag<PGWINDOW_ID>
                , extractor_PGWindowID
                , std::less<unsigned>
            > //unique order
          , boost::multi_index::sequenced< 
                boost::multi_index::tag<PGWINDOW_SEQ> 
            >
        > //indexed by
    >
    pgwindow_container;

    //iterators
    typedef pgwindow_container::iterator itr_pgwindow_container;
    typedef pgwindow_container::reverse_iterator ritr_pgwindow_seq_container;
    
    typedef pgwindow_container::index<PGWINDOW_ID>::type::iterator itr_PGWINDOW_ID;
    typedef pgwindow_container::index<PGWINDOW_SEQ>::type::iterator itr_PGWINDOW_SEQ;


Поменять два эллемента местами через iterator.

Я сделал так:

        itr_PGWINDOW_ID itrIDEl = m_child.get<PGWINDOW_ID>().find( child_id );
        itr_PGWINDOW_SEQ itrEl = m_child.project<PGWINDOW_SEQ>( itrIDEl );
        itr_PGWINDOW_SEQ itrE = m_child.get<PGWINDOW_SEQ>().end();
        std::advance(itrE, -1);

        PGWindow* wndE = (*itrE);
        PGWindow* wndEl = (*itrEl);

        m_child.get<PGWINDOW_SEQ>().pop_back();
        m_child.get<PGWINDOW_SEQ>().modify( itrEl, modifer_PGWindow( wndE ) );
        m_child.get<PGWINDOW_SEQ>().push_back( wndEl );


Но ИМХО это кривовато как то...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.