c++ - 类图数据结构和 C++ 实现

标签 c++ data-structures

<分区>

我正在用 C++ 编写一个模拟,其中包含许多由整数索引的小实体,每个实体之间都有各种类型的关系。我有一个存储关系数据的基本结构,关系是单向的(A 可以是 B 的 friend ,但 B 不一定与 A 有任何关系)。

所以我有很多数据的形式(整数索引,整数索引,数据......)

  1. 我经常需要从一个实体(索引)开始,然后找到它与其他实体的所有关系(因此第一个条目等于某个索引的所有三元组)。

  2. 有时我还需要从模拟中移除实体并销毁所有引用它们的关系(移除所有第一个或第二个条目等于给定整数的三元组)。

在一个极端情况下,我可以按任意顺序存储所有内容并每次都搜索它以构建我需要从中提取的任何列表(我在上面的#1 和#2 中引用的列表)。这需要最少的数据,但也会非常慢。另一个极端是我跟踪多个索引结构,这些结构允许我更快地执行上面描述的两个操作,但会占用一些内存。很难简洁地描述我的意思,但您可以想象一个列表列表,它可以让您快速回答“三元组中第一个条目为 47 的所有关系是什么”这个问题。

我对数据结构一无所知,但我想这一定是人们以前遇到和思考过的问题。是否有任何 C++ 库具有可以自动跟踪此类索引信息或与我所描述的内容相关的数据结构?谢谢!

最佳答案

我会做这样的事情:

class Entity;

class Relationship // usually called Edge
{
  Entity *from;
  Entity *to;
  // other data
};

class Entity // usually called Node
{
  list<Relationship*> incoming;
  list<Relationship*> outgoing;
};

vector<Entity*> roster;

您可能希望将 roster 包装在某种 EntityHandler 类中,以管理所有这些指针。

对于 #1,通过编号在花名册中查找实体(例如 roster[5]),该实体的 outgoing 就是您想要的 - 您可以进行(指针的)浅拷贝或(关系的)深拷贝。

对于#2,查找实体并遍历它的两个关系列表;对于每个关系,从另一端实体中的列表中删除相应的指针,然后删除关系。然后删除实体。并且不要忘记将花名册中的指针设置为 NULL。

关于c++ - 类图数据结构和 C++ 实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23480523/

相关文章:

c++ - 为 C++ 获取 AST?

c++ - 找不到 Dyld 符号错误

c++ - 为什么或何时应该在调用前将可调用函数参数转换为右值?

c++ - 以优雅的方式进行二进制比较操作

c++ - Microsoft Visual Studio Express 2012 不会运行单个程序

algorithm - 我们能否构造一棵只有后序遍历或前序遍历的满二叉树?

python - 找到立方等于平方的数字对

c - 帮助递归函数

algorithm - 概率数据结构

c - 用户输入的队列大小