如何从multi_index_container获取倒数第二个元素

时间:2016-05-22 08:32:30

标签: c++ boost boost-multi-index

我有一个boost::multi_index_containerhashed_uniquesequenced编入索引。如何从此容器的最后一个元素中获取第二个?

struct MyContainer : public mi::multi_index_container<
    MyStruct,
    mi::indexed_by<
        mi::hashed_unique<
          mi::tag<hashed>,
          %some stuff%,
          %some stuff%,
          %some stuff%>
        >,
        mi::sequenced<mi::tag<sequenced> >
    >
>
{ };

当容器被散列时,我可以通过其散列找到任何元素。但就我而言,我不知道倒数第二个元素的哈希值。但是,我知道最后一个元素的哈希,因此可以得到最后一个元素。

MyContainer::iterator myIter = m_table.find(hashOfLast);

我可以使用这个myIter来获取前一个元素的迭代器吗?

编辑:

我可以这样做吗?

MyContainer::nth_index<1>::type& seqIdx = m_table.get<1>();
auto current = seqIdx.rbegin();
auto last = seqIdx.rend();

if(current != last){
    current++;
    //How to get the hash of this element now?
}

1 个答案:

答案 0 :(得分:1)

您可以按如下方式使用iterator projection

MyContainer::index<sequenced>::type::iterator it=
  m_table.get<sequenced>().end(); // iterator to end of sequenced index
--it;--it; // two steps back
MyContainer::iterator myIter=m_table.project<hashed>(it); // project into the hashed index

请注意,相同的技术可用于一对一的位置,这可能使您无需保留hashOfLast变量。

  

我可以使用这个myIter来获取前一个元素的迭代器吗?

否(除非你采用如上所示的迭代器投影),原因有两个:

  • 散列索引迭代器(与序列索引不同)不是双向的(可递增和可递减的),只是向前(可递增)。
  • 即使myIter coud递减,它也不会指向序列索引中倒数第二个位置的元素:两个索引中的遍历顺序完全不相关。