увеличить multi_index_container смена ключей — & gt; неправильное состояние контейнера

Предположим, у нас есть многоиндексный контейнер:

#include <iostream>
#include <boost/multi_index_container.hpp>
#include <boost/multi_index/hashed_index.hpp>
#include <boost/multi_index/random_access_index.hpp>
#include <boost/multi_index/tag.hpp>
#include <boost/multi_index/key_extractors.hpp>

struct A{
A(int i){id=i;}
int id;
};

typedef boost::multi_index::multi_index_container<
A * ,
boost::multi_index::indexed_by<
boost::multi_index::random_access<
boost::multi_index::tag<by_insertion>
>, // this index represents insertion order
boost::multi_index::hashed_unique<
boost::multi_index::tag<by_id>,
boost::multi_index::member<A, int, &A::id>
>
>
> MapType;

MapType map;

map.get<1>().insert(new A(1));
map.get<1>().insert(new A(2));

(*map.get<1>().find(1))->id=4; // HERE IF I CHANGE THE KEY, I CAN NOT FIND either key=4 or 1

MapType::nth_index<1>::type::iterator it = map.get<1>().find(4);
if(it != map.get<1>().end() ){
std::cout << "FOUND A:" << *it << std::endl;
} // DOES NOT WORK?? WHY CANT I FIND the ELement with Key 4?

Проблема сейчас в том, что я, вероятно, настроил boost::multi_index::member<A, int, &A::a> неправильно, потому что когда я меняю какой-то ключ. Я не могу найти элемент с ключом = 4?

Что здесь неправильно используется?
Любая помощь действительно ценится!

1

Решение

Нет, хешированные индексы не хранят хеш-значения, они всегда вычисляются на лету. Почему вы хотите изменить ключи, продолжая искать старые значения?

1

Другие решения

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

  • использование modify(), который проверяет, нужно ли перемещать измененный элемент вследствие прикосновения к некоторому ключу.
  • Если вы знаете, что не измените ключ, используйте const_cast<A&>() и измените, как вам угодно.

В общем, Boost.MultiIndex не может предоставить доступ для записи только неключевым частям элемента.

1

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector