Код: Выделить всё
struct ptr{
const node *ptr;
// refcounting at the map size granularity, rather individual nodes
// using _c to manage when to clear stord pnodes (nid.clear())
// This is better than shared_ptr ref counting where ref counter is maintainer per node allocated.
// (here only one )
static size_t _c;
ptr(const node *_ptr = nullptr) : ptr(_ptr) { if(ptr) _c++; }
ptr(const ptr& rhs) { ptr = rhs.ptr; if(ptr) _c++;}
ptr(const ptr&& rhs) { ptr = rhs.ptr; if(ptr) _c++;}
inline operator node() const{
return *ptr;
}
inline const node* operator->() const { return ptr;}
inline ptr& operator=(const ptr& rhs) {
if(!ptr && rhs.ptr != nullptr ) _c++;
ptr = rhs.ptr;
return *this;
}
inline ptr& operator=(const ptr&& rhs) {
if(!ptr && rhs.ptr != nullptr ) _c++;
ptr = rhs.ptr;
return *this;
}
inline bool operatorsecond = ptr(&(r.first->first));
return r.first->second;
}
Можно ли предположить, что указатели на ключ остаются действительными в течение всего времени жизни карты nid до тех пор, пока сам ключ не будет удален или стерт?
Я реализовал это и отметил, что это работает.
Кроме того, я добавил класс ptr, который ref подсчитывает экземпляры узлов на карте с степенью детализации Map.size, а скорее индивидуальной для каждого счетчика ссылок узла (чтобы сэкономить накладные расходы на такое количество счетчиков ссылок, как в дизайнеshared_ptr).< /p>
Я считаю, что этот дизайн обеспечивает лучшую экономию места на необходимом счетчике ссылок.
Единственная проблема, которую я, похоже, не могу решить, заключается в том, что когда вызывается _mp.clear, это, похоже, вызывает сегментацию. вина. Я считаю, что я собрал весь _c++ там, где это необходимо.
Подробнее здесь: https://stackoverflow.com/questions/784 ... map-in-map