关于擦除boost多索引的迭代器

时间:2015-02-04 15:36:37

标签: c++ iterator boost-multi-index

我想通过在访问集合时删除迭代器来删除boost multi-index容器中的某些元素。

我不确定是否涉及任何迭代器失效以及我的代码是否会使firstlast迭代器无效。

如果下面的代码不正确,这是考虑下面特定索引(ordered_unique)的最佳方法吗?

 #include <iostream>
 #include <stdint.h>
 #include <boost/multi_index_container.hpp>
 #include <boost/multi_index/ordered_index.hpp>
 #include <boost/multi_index/key_extractors.hpp>
 #include <boost/shared_ptr.hpp>

  using namespace std;

  class MyClass{
  public:  
    MyClass(int32_t id) : id_(id) {}
    int32_t id() const
    { return id_; }
  private:  
    int32_t id_;
  };

  typedef boost::shared_ptr<MyClass> MyClass_ptr;

  typedef boost::multi_index_container<
      MyClass_ptr,
      boost::multi_index::indexed_by<
        boost::multi_index::ordered_unique<
          boost::multi_index::const_mem_fun<MyClass,int32_t,&MyClass::id>
        >
      >
    > Coll;

  int main() {

    Coll coll;
    // ..insert some entries 'coll.insert(MyClass_ptr(new MyClass(12)));'

    Coll::iterator first = coll.begin();
    Coll::iterator last  = coll.end();

    while(first != last) {
      if((*first)->id() == 3)
        coll.erase(first++);
      else 
        ++first;    
    }  
 }

1 个答案:

答案 0 :(得分:1)

容器的erase返回迭代器的原因是使用该结果:

first = coll.erase(first);

然后您不必担心底层实现如何处理erase或它是否会转换元素。 (例如,在vector中,您的代码将跳过迭代中的元素)但是,documentation确实声明:

  

很有可能将随机访问索引看作是在Boost.MultiIndex中使用的std :: vector的类比,但这个比喻可能会产生误导,因为这两种结构虽然在许多方面相似,但显示出重要的语义差异。随机访问索引的一个优点是它们的迭代器以及对它们元素的引用是稳定的,也就是说,它们在任何插入或删除后仍然有效。

尽管如此,仅仅看到coll.erase(first++)对我来说是一面旗帜,所以更愿意以另一种方式做到这一点。