我面临单一链接列表类的设计选择。粗略的想法是:
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
的使用数量,同时仍然支持结构共享?有点像在shared_ptr
中组合两个Node
来减少控制块的开销......我不知道,也许没有办法,或者可能没有。任何想法都是受欢迎的,甚至是完全重新设计List
课程。
答案 0 :(得分:2)
您希望在没有结构的情况下共享数据(相反的情况)。
您想要分享结构。
两者都需要共享指针。但是,如果你想减少控制块开销,只要你纠缠生命周期就可以做到这一点。
您可以将T&#39的生命周期与其节点绑定。然后,反向节点还需要使原始节点保持不变。这可能导致结构比其需求更长,但使纯粹的前提案件更便宜。
使指向T的指针成为原始指针。
创建一个包含T和Node的组合结构。
使用make_shared
创建它。
现在在组合结构中的T处指向T指针。
接下来,使用别名ctor为共享组合结构的控制块的节点创建共享ptr。
要反转,请创建一个带有Node的helper结构和一个到Node的共享ptr。分享帮助。将共享节点ptr指向前向节点,将T ptr指向前向节点中的T ptr,然后使用共享ptr的别名ctor获取到节点的共享ptr。
我认为这不值得。