[英]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]
更新內容的干凈方法是先刪除,然后重新插入修改后的項目。
如果這確實嚴重損害了性能
mutable
成員,請考慮通過引用包括非關鍵數據) const_cast<>
拋棄const,在抽象中打一個洞。 危險請勿將此引用傳遞給任何其他方,因為它們可能破壞容器不變式,因為他們可能不知道將關鍵字段留空
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.