关于 boost multiindex 默认元素排序
About boost multiindex default elements ordering
我注意到 multi_index_container 中的项目默认按第一个索引排序。
示例:
typedef multi_index_container<
MyStruct,
indexed_by<
ordered_unique<member< MyStruct, int, &MyStruct::id> >,
ordered_non_unique<member< MyStruct, int, &MyStruct::salary> >
>
> MyStructsContainer;
int _tmain(int argc, _TCHAR* argv[])
{
MyStructsContainer myStructsContainer;
MyStructsContainer::iterator it1 = myStructsContainer.emplace(MyStruct{ 1, 100 }).first;
assert(distance(it1, myStructsContainer.end()) == 1 );
MyStructsContainer::iterator it2 = myStructsContainer.emplace(MyStruct{ 2, 20 }).first;
assert(distance(it1, myStructsContainer.end()) == 2);
}
我的问题是 - 这是一个记录在案的 "well known" 行为,我可以依赖它吗?或者它只是一个副作用?
我有一个结构列表 "MyStruct",它们应该按 ID 排序。但出于某种原因,我必须从排序队列中知道它们的数字索引。如果我可以使用这种方法,那么就没有必要在第一个有序索引上进行查找,然后再查找 std::distance.
谢谢,
卡林
是的,你可以依靠它。来自 docs:
The functionality of index #0 can be accessed directly from a multi_index_container object without using get<0>()
: for instance, es.begin()
is equivalent to es.get<0>().begin()
.
我注意到 multi_index_container 中的项目默认按第一个索引排序。
示例:
typedef multi_index_container<
MyStruct,
indexed_by<
ordered_unique<member< MyStruct, int, &MyStruct::id> >,
ordered_non_unique<member< MyStruct, int, &MyStruct::salary> >
>
> MyStructsContainer;
int _tmain(int argc, _TCHAR* argv[])
{
MyStructsContainer myStructsContainer;
MyStructsContainer::iterator it1 = myStructsContainer.emplace(MyStruct{ 1, 100 }).first;
assert(distance(it1, myStructsContainer.end()) == 1 );
MyStructsContainer::iterator it2 = myStructsContainer.emplace(MyStruct{ 2, 20 }).first;
assert(distance(it1, myStructsContainer.end()) == 2);
}
我的问题是 - 这是一个记录在案的 "well known" 行为,我可以依赖它吗?或者它只是一个副作用?
我有一个结构列表 "MyStruct",它们应该按 ID 排序。但出于某种原因,我必须从排序队列中知道它们的数字索引。如果我可以使用这种方法,那么就没有必要在第一个有序索引上进行查找,然后再查找 std::distance.
谢谢, 卡林
是的,你可以依靠它。来自 docs:
The functionality of index #0 can be accessed directly from a multi_index_container object without using
get<0>()
: for instance,es.begin()
is equivalent toes.get<0>().begin()
.