2016-05-22 20 views
0

sequencedによってインデックスされたboost::multi_index_containerがあります。このコンテナから最後の要素の2番目を取得するにはどうすればよいですか?multi_index_containerから最後の2番目の要素を取得する方法

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> > 
    > 
> 
{ }; 

コンテナがハッシュされているので、ハッシュで任意の要素を見つけることができます。しかし、私の場合、2番目から最後の要素のハッシュはわかりません。しかし、私は最後の要素のハッシュを知っているので、最後の要素を得ることができます。

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

ハッシュ索引に表示される順序要素に応じてa)またはb)順序付き索引の順序に従って最後から2番目までを意味しますか? –

+0

シーケンスインデックスによると –

答えて

1

次のようにあなたがiterator projectionを使用することができます。同じ技術があなたのhashOfLast変数を維持する必要性をあなたに分配可能性がある1対最後の位置に使用することができることを

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 

注意を。

このmyIterを使用して、前の要素のイテレータを取得できますか?

2つの理由なし(あなたが上記のように突起をイテレータに頼らない限り)、(配列決定インデックスのものとは異なる)

  • ハッシュされたインデックスイテレータは(incrementableとdecrementable)双方向性ではなく、単に前方(インクリメンタル)。
  • myIterがデクリメントされても、順序付きインデックスの最後から2番目の位置を指すことはありません。両方のインデックスのトラバーサルオーダーは完全に無関係です。
+0

ありがとう!私はちょうど私の編集で示したものに似た何かをしました。これは使えますか? –

+0

投稿の編集部分の目的を理解できません:取得したい '*現在の*ハッシュ値*ですか?これは最初に提起した疑問とはほとんど関係がありません。 –

+0

先ほど答えたように、最後の要素から2番目の要素を取得します。しかし、私はその課題を達成する別の方法を考え、それを編集で示しました。私によれば '* current *'は最後から2番目の要素です。私が間違っていれば私を修正してください。 –

関連する問題