Как вставить значение в коллекцию С++ boost::multiindex по определенному индексу, например, в std::list

В boost::multi_index я пытаюсь вставить значение в определенное место, однако я не нашел ни одного примера, как выполнить эту задачу в документации по повышению https://www.boost.org/doc/libs/1_59_0/libs/multi_index/doc/tutorial/indices.html или в другом месте.

Это код, который позволяет вставлять в начало или конец коллекции.

struct animal {
    std::string name;
    int legs;
};

typedef multi_index_container<
        animal,
        indexed_by<
                sequenced<>,
                ordered_non_unique<member<animal, std::string, &animal::name>>,
                ordered_non_unique<member<animal, int, &animal::legs>>,
                random_access<>
        >
> animal_multi;

int main() {
    animal_multi animals;

    animals.push_back({"shark", 0});
    animals.push_back({"spider", 8});
    animals.push_front({"dog", 4});

    auto it = animals.begin();
    auto end = animals.end();
    for (; it != end; ++it)
        std::cout << it->name + " ";

    return 0;
}

Текущий выход: паук-акула-собака

Как мне настроить код, чтобы передать что-то, например, между акулой и пауком?


person Fataho    schedule 11.09.2019    source источник


Ответы (1)


Что вы можете сделать, это следующее

//...
auto it = animals.begin();
animals.emplace(++(++it), animal{"elephant", 4});
//...

Обратите внимание, что ++it, поскольку random_access<> дает вам дополнительные operator[] и at() для позиционного доступа к элементам, но не предоставляет итератору operator+=, насколько я могу судить. Это означает, что вам придется пройтись по контейнеру, чтобы найти место, куда нужно вставить элемент.

Согласно документации, индексы произвольного доступа имеют несколько недостатков по отношению к std::vector:

Они не обеспечивают непрерывность памяти, свойство std::vectors, благодаря которому элементы хранятся рядом друг с другом в одном блоке памяти.

person Tom Trebicky    schedule 11.09.2019