c++ - 为侵入式容器的迭代器分配新值

标签 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 迭代器(以及一般意义上的侵入式容器)分配一个新值。

最佳答案

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

例如当跨 struct { int key; std::string value; }; 的元素构建集合时, 修改 key通过迭代器的字段将导致[未定义的行为]

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

如果这真的对性能影响太大

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

关于c++ - 为侵入式容器的迭代器分配新值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27165578/

相关文章:

c# - 如何获取图像中某些文本的坐标?

c++ - 返回值优化的魔力是什么?

c++ - 使用 Qt 和 Boost 为应用程序编译 CppUTest 测试时的奇怪行为

java - 如果对同一个集合调用同一个迭代器两次,会发生什么情况?

c++ - 使用 list<Object*> C++ 的迭代器编译器错误

c++ - vector 迭代器不兼容

c++ - Boost Graph Library 中的顶点描述符和索引有什么区别?

c++ - boost 正则表达式中的命名捕获/组列表

gcc - 将 gcc vector::iterator 传递给函数有什么问题?

c++ - 如何: non-root qml frontend and root-privileged worker threads