2016-05-22 3 views
0

У меня есть boost::multi_index_container с индексом hashed_unique и sequenced. Как я могу получить второй из последнего элемента из этого контейнера?Как получить второй из последнего элемента из 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

Вы имеете в виду второе и последнее а) в соответствии с элементами заказа, которые появляются в хэшированном индексе или 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, чтобы получить итератор предыдущего элемента?

Нет (если не прибегать к итератора проекции, как показано выше), из-за двух причин:

  • HASHED индекса итераторы (в отличие от тех секвенсированных индексов) не являются двунаправленными (incrementable и decrementable), просто вперед (увеличивается).
  • Даже если значение myIter coud будет уменьшено, оно не будет указывать на элемент во второй-последней позиции в индексе последовательности: порядки обхода обоих индексов полностью не связаны.
+0

Спасибо! Я сделал что-то похожее на то, что я только что показал в своем редактировании. Будет ли это работать? –

+0

Я не понимаю цели отредактированной части вашего сообщения: это хэш-значение * '* current', которое вы хотите получить? Это мало связано с вопросом, который вы изначально задали. –

+0

Я хочу получить второй из последнего элемента, как вы ответили ранее. Но я думал о другом способе выполнения задачи и показал это в редактировании. '* current *' по мне - это второй по последний элемент. Пожалуйста, поправьте меня, если я ошибаюсь. –