Supposed we have a multi index container:

#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?

The problem is now that i probably set up the boost::multi_index::member<A, int, &A::a> wrongly because when I change some key. I cannot find the element with key = 4?

Whats wrongly used here? Any help really appreciated!

有帮助吗?

解决方案

No, hashed indices do not store hash values, they always calculate it on the fly. Why do you want to change keys yet keep looking up by the old values?

其他提示

Answering Gabriel's last comment: using a container of pointers just to have write access to the elements is overkill. You can do instead one of the following:

  • Use modify(), which checks if the modified element has to be relocated as a consequence of some key having been touched.
  • If you know you won't change a key, cast with const_cast<A&>() and modify as you please.

In general, Boost.MultiIndex has no way to grant write access only to non-key parts of the element.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top