C++11 boost::多索引容器擦除函数重新存储?

C++11 boost::多索引容器擦除函数重新存储?,c++11,map,boost-multi-index,C++11,Map,Boost Multi Index,我有以下问题: 我定义了一个boost::multi_index_容器,这里是一个简化的定义,它通过成员函数指针&TYPE::m_id散列TYPE,其中m_id是一个整数类型 boost::multi_index::multi_index_container< TYPE * , boost::multi_index::indexed_by< boost::multi_index::hashed_unique< boost:

我有以下问题: 我定义了一个boost::multi_index_容器,这里是一个简化的定义,它通过成员函数指针
&TYPE::m_id
散列
TYPE
,其中
m_id
是一个整数类型

boost::multi_index::multi_index_container<
    TYPE * ,
    boost::multi_index::indexed_by<
        boost::multi_index::hashed_unique<
            boost::multi_index::tag<by_hashed_id>,
            boost::multi_index::member<TYPE, const TYPE, &TYPE::m_id>
        >
    >
> map;

检查是否定义了BOOST\u MULTI\u INDEX\u ENABLE\u INVARIANT\u CHECKING宏。使用此宏,容器将验证内部完整性并尝试访问已删除的对象。顺便说一句,有序索引不能基于散列,但在擦除后确实需要某种具有重新平衡的树,但通常没有理由访问被删除的元素。

要回答主题行中的问题:有序索引,如您在所示代码中使用的索引,不要散列/重新散列,因为它们不是基于散列的。散列索引(这里似乎没有使用)不会在
erase
上重新散列。堆栈跟踪上显示的符号看起来与Boost.MultiIndex完全不同。

ahhh,谢谢!,堆栈跟踪确实不是来自boost::multiindex,见鬼。。。。我完全错过了这个
hashMap = map.index.get<by_hashed_id>()
it = hashMap.find(30);
delete *it;          /// Delete the underlying pointer
hashMap.erase(it);  /// Delete in the map (segfault if the map is rehashed (?))
 [a9203:03910] Signal: Segmentation fault (11)
121 [a9203:03910] Signal code: Address not mapped (1)
122 [a9203:03910] Failing at address: (nil)
123 [a9203:03910] [ 0] /lib64/libc.so.6() [0x36846329a0]
124 [a9203:03910] [ 1] /lib64/libc.so.6() [0x368468e312]
125 [a9203:03910] [ 2] /program( ZNSt10_HashtableIjSt4pairIKjN15BodyProcessInfo5FlagsEESaIS4_ENSt8__detail10_Select1stESt8equal_toIjESt4hashIjENS6_18_Mod    _range_hashingENS6_20_Default_ranged_hashENS6_20_Prime_rehash_policyENS6_17_Hashtable_traitsILb0ELb0ELb1EEEE5clearEv+0x3f)