Есть такой контейнер, который упорядочен и по уникальному ID и по неуникальному композиному S с BYPP
struct SSS
{
SSS( unsigned id, unsigned aS, unsigned aBYPP )
: S(aS)
, BYPP(aBYPP)
, ID(id)
{}
unsigned get_tex_prop_FREE_S() { return S; }
unsigned get_tex_prop_BYPP() { return BYPP; }
unsigned get_tex_prop_ID() { return ID; }
void do_change_S() { изменяется... S }
unsigned ID, S, BYPP;
};
//pointer to SSS
typedef boost::shared_ptr< SSS > ptr_videotexture;
//tags
struct VIDEO_TEX_ID{};
struct VIDEO_TEX_S_BYPP{};
//extractors
struct extractor_tex_FREE_S
{
typedef unsigned result_type;
PGINLINE result_type operator()( const ptr_videotexture& tex ) const
{
return tex->get_tex_prop_FREE_S();
}
};
struct extractor_tex_BYPP
{
typedef unsigned result_type;
PGINLINE result_type operator()( const ptr_videotexture& tex ) const
{
return tex->get_tex_prop_BYPP();
}
};
struct extractor_tex_ID
{
typedef unsigned result_type;
PGINLINE result_type operator()( const ptr_videotexture& tex ) const
{
return tex->get_tex_prop_ID();
}
};
//container
typedef boost::multi_index_container <
ptr_videotexture
, boost::multi_index::indexed_by <
boost::multi_index::ordered_unique <
boost::multi_index::tag<VIDEO_TEX_ID> //tag
, extractor_tex_ID
, std::less<unsigned> //key extractor
>
, boost::multi_index::ordered_non_unique <
boost::multi_index::tag<VIDEO_TEX_S_BYPP>, //tag
boost::multi_index::composite_key < //key extractor
ptr_videotexture
, extractor_tex_BYPP
, extractor_tex_FREE_S
> //composite
> //non unique
> // indexes
> //multi index
video_tex; //container type
//iterators
typedef video_tex::index<VIDEO_TEX_ID>::type::iterator itr_ID_video_tex_container;
typedef video_tex::index<VIDEO_TEX_S_BYPP>::type::iterator itr_FREE_S_BYPP_video_tex_container;
video_tex m_video_tex;
В какой момент времени в коде заставляют пересчитать S делают так:
itr_ID_video_tex_container itr = m_video_tex.get<VIDEO_TEX_ID>().find( *video_tex_id );
(*itr)->do_change_S();
Как теперь заставить контейнер переиндексировать эллементы.
replace — делать нельзя так как имеем уникальное ID,
modify — вроде бы тоже не применим
Как вариант можно сохранить значение итератора, потом стереть эллемент по итератору и опять вставить соранённое значение.
Но мне кажется что можно сделать средствами буста и быстрее и проще.
Можете подсказать как?
Здравствуйте, nen777w, Вы писали:
N>Есть такой контейнер, который упорядочен и по уникальному ID и по неуникальному композиному S с BYPP
(не читал)
N>Как теперь заставить контейнер переиндексировать эллементы.
N>replace — делать нельзя так как имеем уникальное ID,
N>modify — вроде бы тоже не применим
именно их и надо использовать.
они всегда вызывают переиндексацию и различаются подходом к обработке ошибок: если изменение привело к нарушению индексации (типа нарушение уникальности индекса), replace оставит элемент нетронутым (ценой копирования), а modify его удалит забесплатно.
http://www.boost.org/libs/multi_index/doc/tutorial/basics.html#ord_updating
Можно ли как-то менять элементы в sequenced indeces местами, без полной переиндексации? Ведь они уж точно не зависят ни от каких элементов. Зачем переиндексировать например id, если мне надо переместить sequenced итератор, например, в начало?
Логично бы было добавить для sequenced индексов методы swap и move, тогда бы и целостность соблюдалась.