Присвоение нового значения итератору навязчивого контейнера

Во время работы над интрузивным контейнером 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 (и в общем смысле навязчивому контейнеру).

0

Решение

Причина, по которой вы получаете const_iteratorВ основном это связано с тем, что изменение полей может нарушить инварианты контейнера.

Например. при построении множества элементов struct { int key; std::string value; };, модифицируя key поле через итератор приведет к [неопределенному поведению]

Чистый способ обновления — сначала удалить, а затем снова вставить измененный элемент.

Если это действительно сильно ухудшает производительность

  1. пересмотреть свой дизайн (рассмотреть mutable члены для неключевых полей, рассмотрите возможность включения неключевых данных по ссылке)
  2. пробить дыру в абстракции с помощью const_cast<> отбросить конст. ОПАСНОСТЬ Не передавайте эту ссылку какой-либо другой стороне, потому что они нарушат инварианты контейнера, так как они могут не знать, чтобы оставить ключевые поля в покое
3

Другие решения


По вопросам рекламы [email protected]