Об упорядочении элементов мультииндекса boost по умолчанию

Я заметил, что по умолчанию элементы в 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);
}

Мой вопрос: это задокументированное, «хорошо известное» поведение, и я могу на него положиться? Или это просто побочный эффект?

У меня есть список структур "MyStruct", и они должны быть отсортированы по их идентификатору. Но мне почему-то надо узнать их числовой индекс из отсортированной очереди. Если я смогу использовать этот подход, это избавит от необходимости выполнять поиск по 1-му упорядоченному индексу, а затем по std::distance.

Спасибо, Калин


person Kiko    schedule 04.02.2015    source источник


Ответы (1)


Да, на него можно положиться. Из документов:

Доступ к функциональным возможностям индекса #0 можно получить непосредственно из объекта multi_index_container без использования get<0>(): например, es.begin() эквивалентно es.get<0>().begin().

person John Zwinck    schedule 04.02.2015