将新值分配给侵入容器的迭代器

时间:2014-11-27 07:49:11

标签: c++ boost iterator intrusive-containers

在使用boost侵入式容器splay_set时,我必须重置本地迭代器成员变量。请参阅下面的示例代码 -

#include <boost/intrusive/splay_set.hpp>

using namespace boost::intrusive;

class Obj
{
    public:
        Obj(){};
        ~Obj(){};

        boost::intrusive::list_member_hook<boost::intrusive::link_mode<boost::intrusive::normal_link> > m_memberHook;
    private:
        int a;
};

typedef splay_set<Obj, compare<greater<Obj> >, member_hook<Obj, 
                splay_set_member_hook<boost::intrusive::link_mode<boost::intrusive::normal_link> >,
                &Obj::m_memberHook> > StorageSSet;
typedef StorageSSet::iterator   StorageSSetIter;

class Storage
{
    public:

        bool init(StorageSSet& sset)
        {
            // Error: "no match for operator= in ..."
            m_curIter = sset.begin();  ////<<<<------------- How to set new iterator
            m_endIter = sset.end();    ////<<<<------------- How to set new iterator
        }

    protected:

        StorageSSetIter     m_curIter;
        StorageSSetIter     m_endIter;
};

我认为侵入式容器不支持任务。我也无法通过成员初始化列表初始化splay_set迭代器。在boost和其他网站上有这么有限的例子。没有给出这个问题的明确答案。

我的问题是我该怎么做才能为splay_set迭代器赋予一个新值(一般来说就是一个侵入式容器。)

1 个答案:

答案 0 :(得分:3)

您获得const_iterator的原因主要是因为修改字段可能会破坏容器不变量。

E.g。在struct { int key; std::string value; };元素之间构建集合时,通过迭代器修改key字段会导致[未定义行为]

更新内容的简洁方法是首先删除,然后重新插入修改后的项目。

如果这真的伤害了表现太糟糕

  1. 重新考虑您的设计(考虑mutable成员的非关键字段,请考虑通过引用包含非关键数据)
  2. 使用const_cast<>抛弃const,在抽象中打洞。 危险请勿将此引用传递给任何其他方,因为它们会破坏容器不变量,因为它们可能不知道单独保留关键字段