Multi_index_container删除最后一个元素

multi_index_container removing last element

本文关键字:最后一个 元素 删除 container index Multi      更新时间:2023-10-16

我有以下定义:

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()一起使用。

谢谢

使用'sequenced<>索引,您可以获得类似于'std::list'的语义,请参阅boost中的文档和代码示例。把你的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'的额外语义,你得到了一个双向迭代器,并按照这个问题递减它,像这样:

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()

—EDIT—

如果"last"的语义不是插入的顺序,而是ordered_non_unique索引的顺序,你可以使用'reverse_iterator::base()',它会给下一个元素提供一个向前的'迭代器':

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()

参见关于将反向迭代器转换为正向迭代器的答案