Я столкнулся с выбором дизайна для отдельного класса списка. Грубая идея заключается в следующей:Уменьшить количество shared_ptrs в постоянной структуре данных
template<typename T>
class List {
public:
...
private:
struct Node {
std::shared_ptr<const T> value;
std::shared_ptr<const Node> next;
};
std::shared_ptr<const Node> node_;
};
Да, я знаю, что есть много shared_ptr
с блуждающим вокруг, но это потому, что List
является функциональной настойчивой структурой данных, которая должна как можно больше структурного обмена, насколько это возможно. В этой реализации, например, для реверсирования списка не требуется копировать какие-либо элементы, а несколько списков могут совместно использовать общий под-список (указывая на один и тот же хвост shared_ptr
).
Это, как говорится, я все еще чувствую, что, возможно, слишком много shared_ptr
. Есть ли все-таки, чтобы уменьшить количество используемых shared_ptr
s, все еще поддерживая структурное разделение? Что-то вроде сочетания двух shared_ptr
s внутри Node
, чтобы уменьшить накладные расходы блоков управления ... Я не знаю, может быть, нет пути, а может быть, есть. Любая идея приветствуется, даже о переделке всего класса List
.
Не может ли узел инкапсулировать T? –
@ RichardHodges Можете ли вы рассказать? –
Почему не простой член 'T'? –