簡體   English   中英

為侵入式容器的迭代器分配新值

[英]Assigning a new value to a iterator of a intrusive container

在工作增強侵入式容器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; }; struct { int key; std::string value; }; ,通過迭代器修改key字段將導致[Undefined Behaviour]

更新內容的干凈方法是先刪除,然后重新插入修改后的項目。

如果這確實嚴重損害了性能

  1. 重新考慮您的設計(考慮非關鍵字段的mutable成員,請考慮通過引用包括非關鍵數據)
  2. 通過使用const_cast<>拋棄const,在抽象中打一個洞。 危險請勿將此引用傳遞給任何其他方,因為它們可能破壞容器不變式,因為他們可能不知道將關鍵字段留空

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM