2016-05-22 114 views
0

我有一個boost::multi_index_container索引hashed_uniquesequenced。我怎樣才能從這個容器的最後一個元素獲得第二個?如何從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? 
} 
+1

你的意思是倒數第二個a)根據順序元素出現在散列索引還是b)根據順序索引中的順序? –

+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來得到一個迭代器到上一個元素嗎?

否(除非你採取迭代器投影如上圖所示),因爲兩個原因:

  • 散列索引的迭代器(不像那些序列索引)是不是雙向的(可遞增和decrementable),只是向前(可增量)。
  • 即使myIter coud遞減,它也不會指向順序索引倒數第二個位置上的元素:兩個索引中的遍歷順序完全不相關。
+0

謝謝!我做了類似於我在編輯中顯示的內容。這會工作嗎? –

+0

我不明白你的文章的編輯部分的目的:它是你想獲得的* current的* hash值*這與你最初提出的問題沒有多大關係。 –

+0

我想從前面的元素中獲得第二個元素,就像你之前回答的那樣。但我想到另一種完成任務的方式,並在編輯中顯示出來。根據我的「* current *」是倒數第二個元素。如果我錯了,請糾正我。 –

相關問題