指向其他许多对象的高效成员指针

问题描述

假设我有一个图,每个节点可能包含其他节点的值。假设计算该值的复杂性相当高( ~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);
}

您可以通过坐标立即访问任何节点。图拥有节点,节点不拥有彼此。事实上,节点甚至不相互引用。这意味着我完全不必担心内存泄漏、重新分配或死指针。所有这些问题都完全消失了。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...