функция вставки boost::multi_index для других индексов

Вот контейнер целых чисел с хешированным индексом и индексом последовательности:

#include <iostream>
#include <boost/multi_index_container.hpp>
#include <boost/multi_index/hashed_index.hpp>
#include <boost/multi_index/identity.hpp>
#include <boost/multi_index/sequenced_index.hpp>

int main()
{
    boost::multi_index_container<
    int,
    boost::multi_index::indexed_by<
        boost::multi_index::hashed_unique<boost::multi_index::identity<int>>,
        boost::multi_index::sequenced<>
        >
    > c;
    for (int i=99; i>=0; --i) c.get<0>().insert(i);
    for (int j : c.get<0>()) std::cout << " " << j;
    std::cout << std::endl;
    for (int k : c.get<1>()) std::cout << " " << k;
    std::cout << std::endl;
    return 0;
}

Когда я запускаю это, я получаю:

 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 99 98 97 96 95 94 93 92 91 90 89 88 87 86 85 84 83 82 81 80 79 78 77 76 75 74 73 72 71 70 69 68 67 66 65 64 63 62 61 60 59 58 57 56 55 54 53 52 51 50 49 48 47 2 1 0   
 99 98 97 96 95 94 93 92 91 90 89 88 87 86 85 84 83 82 81 80 79 78 77 76 75 74 73 72 71 70 69 68 67 66 65 64 63 62 61 60 59 58 57 56 55 54 53 52 51 50 49 48 47 46 45 44 43 42 41 40 39 38 37 36 35 34 33 32 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0

Первая строка показывает, что элементы «разбросаны» по хэш-индексу, как и ожидалось. Вторая строка показывает, что элементы расположены в порядке вставки с помощью упорядоченного индекса. Но элементы были вставлены через хеш-индекс; что мы можем ожидать от элементов упорядоченного индекса? То есть, когда insert вызывается для одного индекса, определены ли функции вставки, используемые для «других» индексов?

В частности: когда контейнер с несколькими индексами имеет хешированный индекс и последовательный индекс, а элементы вставляются только через хешированный индекс, будут ли элементы всегда находиться в порядке вставки через упорядоченный индекс?


person John H.    schedule 03.03.2020    source источник
comment
Это определение последовательного ключа index_by. Внутренне ускорение поддерживает несколько карт из ключевого пространства в его естественном порядке в список. Это легче визуализировать, если вы думаете о multi_index_containers сложного набора данных с ключами index_by для разных полей в наборе. При таком представлении каждое поле имеет собственное отсортированное отображение, которое позволяет выполнять быстрый поиск на основе этого ключа. При использовании последовательных ключей вместо использования одного из полей вы просто используете порядок, в котором оно было вставлено. Итерация гарантируется в порядке ключа   -  person Yonatan    schedule 04.03.2020


Ответы (1)


Что касается последовательных индексов, в документы говорят:

Элементы в упорядоченном индексе по умолчанию сортируются в соответствии с порядком их вставки: это означает, что новые элементы, вставленные через другой индекс multi_index_container, добавляются в конец упорядоченного индекса.

person Joaquín M López Muñoz    schedule 03.03.2020