我有以下定义:
typedef boost::multi_index_container<
boost::shared_ptr<Temp>,
boost::multi_index::indexed_by<
boost::multi_index::ordered_non_unique< boost::multi_index::const_mem_fun<Temp, unsigned int, &Temp::getParam> >
>
> RequestsContainer;
我需要从此容器中删除(弹出)最后一个元素。我怎样才能做到这一点? reverse_iterator不能与erase()一起使用。
谢谢
答案 0 :(得分:2)
使用'sequenced&lt;&gt;'索引你得到类似'std :: list'的语义,请参阅boost中的codumentation和code example。将'typedef'更改为:
typedef boost::multi_index_container<
boost::shared_ptr<Temp>,
boost::multi_index::indexed_by<
boost::multi_index::sequenced<>,
boost::multi_index::ordered_non_unique<
boost::multi_index::const_mem_fun<Temp, unsigned int, &Temp::getParam>
>
>
> RequestsContainer;
然后,拥有'std :: list'的附加语义,你得到一个双向迭代器到最后并按照this question递减它,就像那样:
RequestsContainer r;
/* ... fill r ... */
assert(!r.empty);
auto iter = r.end(); // from sequenced<>
--iter; // iter now points to the last element
r.erase(iter); // pop()
- 编辑 -
如果“last”的语义不是插入的顺序而是order_non_unique索引的顺序,则可以使用'reverse_iterator :: base()',它为前一个'迭代器'提供下一个元素:< / p>
RequestsContainer r;
/* ... fill r ... */
auto index = r.get<1>(); // or get<0> if no sequenced<>
auto riter = index.rbegin(); // reverse_iterator
++riter; // points previous to last element
auto iter = riter.base(); // points to the last element
r.erase(iter); // pop()
另见this关于将反向迭代器转换为转发迭代器的答案。