Во время работы над интрузивным контейнером 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
итератор через список инициализаторов членов. Есть такой ограниченный пример на бусте и другом сайте. Никто не дает четкого ответа на этот вопрос.
Мой вопрос заключается в том, что я должен сделать, чтобы назначить новое значение итератору splay_set (и в общем смысле навязчивому контейнеру).
Причина, по которой вы получаете const_iterator
В основном это связано с тем, что изменение полей может нарушить инварианты контейнера.
Например. при построении множества элементов struct { int key; std::string value; };
, модифицируя key
поле через итератор приведет к [неопределенному поведению]
Чистый способ обновления — сначала удалить, а затем снова вставить измененный элемент.
Если это действительно сильно ухудшает производительность
mutable
члены для неключевых полей, рассмотрите возможность включения неключевых данных по ссылке)const_cast<>
отбросить конст. ОПАСНОСТЬ Не передавайте эту ссылку какой-либо другой стороне, потому что они нарушат инварианты контейнера, так как они могут не знать, чтобы оставить ключевые поля в покое