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

How to get the second to last element from a multi_index_container

我有一个由 hashed_uniquesequenced 索引的 boost::multi_index_container。我怎样才能从这个容器的最后一个元素中获取第二个?

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

您可以按如下方式使用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 变量。

Can I use this myIter to get an iterator to the previous element?

否(除非你求助于如上所示的迭代器投影),原因有二:

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