关于 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().