问题描述
假设我有一个图,每个节点可能包含其他节点的值。假设计算该值的复杂性相当高( ~O(n^4) )。因此,我想存储为每个关系计算的值。我对 C++ 比较陌生,所以这就是我得到的(构造函数等,不包括在内,为了简单起见使用结构):
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 以反映示例的其余部分。
解决方法
很多时候,您希望通过坐标而不是仅相对地访问节点,在这种情况下,您会得到如下结果:
class Coordinate {
int x,y;
};
enum Direction4 {
Left,Up,Right,Down
};
Coordinate operator+(Coordinate,Direction4);
class Node {
Graph* graph;
Coordinate coordinate;
Node* getAdjacent(Direction4 dir);
double calculate(Node other);
};
class Graph {
std::unordered_set<Coordinate,Node> nodes;
};
Node* Node::getAdjacent(Direction4 dir) {
Coordinate coord = coordinate + dir;
auto it = graph->nodes.find(coord);
if (it == graph->nodes.end()) return nullptr;
return &(it->second);
}
您可以通过坐标立即访问任何节点。图拥有节点,节点不拥有彼此。事实上,节点甚至不相互引用。这意味着我完全不必担心内存泄漏、重新分配或死指针。所有这些问题都完全消失了。