Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
typedef std::shared_ptr<PersistentTreap> PtrPersistentTreapclass PtrPersistentTreap {
PersistentTreap* ptr;
void assign(PersistentTreap* newPtr) {
PersistentTreap* oldPtr = ptr;
ptr = newPtr;
if (newPtr) newPtr->link++;
if (oldPtr && --oldPtr->link == 0) delete oldPtr;
}
public:
explicit PtrPersistentTreap(PersistentTreap* ptr = 0) :ptr(0) { assign(ptr); }
PtrPersistentTreap(PtrPersistentTreap const& other) : ptr(0) { assign(other.ptr); }
PtrPersistentTreap(PtrPersistentTreap && other) : ptr(other.ptr) { other.ptr = 0; }
~PtrPersistentTreap() { assign(0); }
PtrPersistentTreap& operator = (PersistentTreap* ptr) { assign(ptr); return *this; }
PtrPersistentTreap& operator = (PtrPersistentTreap const& other) { assign(other.ptr); return *this; }
PtrPersistentTreap& operator = (PtrPersistentTreap && other) { std::swap(ptr, other.ptr); return *this; }
PersistentTreap& operator * () const { return *ptr; }
PersistentTreap* operator -> () const { return ptr; }
};
Вроде ничего не забыл…left и right должны именно PtrPersistentTreap. Их инициализацию из конструкторов теперь можно и убрать. Функция addLink больше не нужна, как и метод del.link вы правы — там и правда в копии должен стоять ноль. Кстати, хитрая получилась ловушка для любителей умных указателей-велосипедов…
Персистентное декартово дерево по неявному ключу