gpt4 book ai didi

c++ - 现代 C++ 对象关系

转载 作者:太空狗 更新时间:2023-10-29 23:44:31 25 4
gpt4 key购买 nike

我有一个使用 struct Nodestruct Edge 实现的图,其中:

  • 每个Edge都有一个起点和一个终点Node
  • 每个 Node 维护一个 Edge 对象的列表,这些对象从它开始或结束

以下是一种可能的实现方式:

struct Node;

struct Edge {
Node *st;
Node *en;
int some_data;
};

const int MAX_EDGES = 100;
struct Node {
Edge *edges[MAX_EDGES];
int some_data;
};

虽然上述结构可以表示我心目中的图形,但我想在满足以下要求的同时以“现代 C++”方式进行处理:

  1. 避免指点
  2. Node::edges 使用 std::vector
  3. 能够在标准 C++ 容器中存储 NodeEdge 对象

这在现代 C++ 中是如何完成的? 1-3都能实现吗?

最佳答案

  1. Avoid pointers

您可以使用 std::shared_ptrstd::weak_ptr为了这。只需决定您是否希望节点拥有边,反之亦然。非拥有类型应该使用 weak_ptr (避免循环)。

除非您的图表是非循环的,否则您可能仍需要注意所有权循环。

std::unique_ptr不是一个选项,因为节点和边之间没有一对一的关系,所以任何给定对象都不可能有唯一的所有者。

  1. Use an std::vector for Node::edges

没问题。让它成为 std::vector<std::weak_ptr<Edge>>std::vector<std::shared_ptr<Edge>> (取决于边是否拥有节点,反之亦然)

  1. Be able to store Node and Edge objects in standard C++ containers

没问题,只需确保您的类型可以安全地移动/复制而不会泄漏或损坏内存,即具有正确的复制/移动构造函数和赋值运算符。如果您使用智能指针和 std::vector,这将自动发生如上所述。

关于c++ - 现代 C++ 对象关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28855056/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com