В контейнере:
//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 );
Но ИМХО это кривовато как то...