如何从 multi_index_container 中获取倒数第二个元素
How to get the second to last element from a multi_index_container
我有一个由 hashed_unique
和 sequenced
索引的 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
可以递减,它也不会指向序列索引中倒数第二个位置的元素:两个索引中的遍历顺序完全无关。
我有一个由 hashed_unique
和 sequenced
索引的 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
可以递减,它也不会指向序列索引中倒数第二个位置的元素:两个索引中的遍历顺序完全无关。