Boost多索引有序迭代器赋值

时间:2014-01-07 21:54:00

标签: c++ boost multi-index

我有一个提升multi_index_container存储一堆具有以下索引的位置

boost::multi_index::indexed_by<
    boost::multi_index::ordered_unique<
            boost::multi_index::tag<Slot>,
            boost::multi_index::identity<SlotData>
        >,  //ordered_unique
    boost::multi_index::ordered_non_unique<
            boost::multi_index::tag<Level>,
            SlotData::ExtractZ
        >,  // ordered_non_unique
...//index by
.//typedef as SlotLocations

在此定义中,我认为默认索引将基于ordered_unique Slot。稍后我有一个迭代器SlotLocations::iterator,我想用它来存储基于Level ordered_non_unique的搜索结果:

typedef SlotLocations::index<Level>::iterator MIterator;

std::pair<MIterator, MIterator> range = map.get<Level>().range(..some conds..);

SlotLocations::iterator itr = range.first;    //error

远程搜索工作并返回range中存储的所需结果,但是此代码不会使用带有标记的标记进行编译,从而产生以下错误:

error: no match for 'operator='

为什么我不能像这样分配/存储迭代器?以及存储搜索结果迭代器的可能方法是什么?

2 个答案:

答案 0 :(得分:2)

您必须跨索引

投影迭代器

应该是

 SlotLocations::iterator itr = project<Slot>(map, range.first);

答案 1 :(得分:2)

关于为什么投影不是通过隐式转换自动完成的第二个问题:实际上原因是不是 @sehe建议的那个(所有索引都是不同的,即使没有标记,它们的迭代器也是如此)保证是不同的类型),但是:投影是通过像

这样的表达式完成的
it1 =  c.project<X>(it0); // X is either a tag or an index number

需要用户提供容器这两个迭代器都属于:也就是说,您不能(通常)将it0转换为it1并保留信息仅it0