【发布时间】:2021-04-12 15:24:04
【问题描述】:
假设我有一个图表,每个节点可能包含其他节点的值。假设计算该值的复杂性相当高( ~O(n^4) )。因此,我想存储为每个关系计算的值。我是 C++ 的新手,所以这就是我得到的(不包括构造函数等,为了简单起见使用 struct):
struct Node{
long id_;
const std::shared_ptr<Node> left_;
const std::shared_ptr<Node> right_;
const std::shared_ptr<Node> up_;
const std::shared_ptr<Node> down_;
std::unordered_map<std::shared_ptr<Node>, double> otherValues;
double calculate(Node other); // do math based on neighboring nodes
};
所以假设节点很少被删除但经常被添加,我想知道这是否是正确的方法?最初,我打算选择weak_ptr,因为所有节点也都存储在其他地方,但是每当我查找下一个节点(一直如此)时,我都必须转换为shared_ptr。我读过的这本书以及大多数文章都指出,如果可能的话,应该使用智能指针,但我想知道原始指针是否是这里更有效的方法。但是我不知道如何在这里实现这些,同时仍然安全。
任何建议将不胜感激!
编辑:我已更改 otherValues 以反映示例的其余部分。
【问题讨论】:
-
循环引用会有问题。并且将您的成员设为
const也会使实际构建图表变得困难。 -
容器应该拥有节点。节点不应相互拥有。
-
原始指针是安全的,只要您在完成网络之前不删除任何节点。这些是结构指针,它们不需要拥有。
-
包含节点的容器是什么样的?
-
应该始终使用智能指针拥有指针。这些不是拥有的,因此它们应该使用原始指针。
标签: c++ performance class smart-pointers member