1

假设我们有一个多索引容器:

#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>错误,因为当我更改一些键时。我找不到 key = 4 的元素?

这里用错了什么?任何帮助真的很感激!

4

2 回答 2

1

不,散列索引不存储散列值,它们总是即时计算。为什么要更改键,但仍要按旧值查找?

于 2013-07-25T13:31:51.793 回答
1

回答 Gabriel 的最后一条评论:使用指针容器只是为了对元素进行写访问是矫枉过正的。您可以改为执行以下操作之一:

  • 使用modify(),它检查修改后的元素是否由于某些键被触摸而必须重新定位。
  • 如果您知道您不会更改密钥,const_cast<A&>()请随意转换和修改。

通常,Boost.MultiIndex 无法仅授予对元素的非关键部分的写访问权限。

于 2013-07-28T11:54:44.810 回答