C++ 用于处理3个整数列表的数据结构

C++ 用于处理3个整数列表的数据结构,c++,data-structures,C++,Data Structures,我目前正在对一个晶格进行物理模拟,我感兴趣的是描述这个晶格中的循环,它们是由晶格单元的边缘组成的闭合曲线。我在一个三维布尔数组中存储这个晶格单元的信息(我指的是一个布尔变量,表示边对组成循环是否有价值) 我现在正在考虑一个好的结构来处理这个循环。它们基本上是一个边列表,所以我需要一个类似于3d整数向量数组的东西,在我当前的参数化中,每条边由3个坐标定义。我已经在考虑围绕这个“列表”对象构建一个类,因为我需要计算循环直径的方法,将来可能还需要更多 但是,我绝对不知道结构的选择,我必须这么做,我的物

我目前正在对一个晶格进行物理模拟,我感兴趣的是描述这个晶格中的循环,它们是由晶格单元的边缘组成的闭合曲线。我在一个三维布尔数组中存储这个晶格单元的信息(我指的是一个布尔变量,表示边对组成循环是否有价值)

我现在正在考虑一个好的结构来处理这个循环。它们基本上是一个边列表,所以我需要一个类似于3d整数向量数组的东西,在我当前的参数化中,每条边由3个坐标定义。我已经在考虑围绕这个“列表”对象构建一个类,因为我需要计算循环直径的方法,将来可能还需要更多


但是,我绝对不知道结构的选择,我必须这么做,我的物理背景在C++中教的不够。因此,我想听听你对这段代码的建议。我真的很喜欢发现一些新的编码方法。你想要两种不同的东西。一种方法是跟踪所有边,并允许通过(int,int,int)索引快速查找边对象(您可能不希望
int
在那里,但需要
size\t
之类的索引)。这完全独立于您的第二个目标,即装入这些有序子集

一般藏品(1) 由于您的边缘数据库将是稀疏的(即,只有少数可能的索引将实际识别为特定边缘),因此我先前建议使用3d矩阵是不合适的。相反,您可能希望使用哈希映射查找边

这有多容易,取决于单个整数的预期大小。也就是说,您能否设法使每个整数的位数不超过21位(例如,如果您的整数是
short int
值,只有16位),那么您可以将它们连接到一个64位值,该值已经有了实现。否则,您将不得不实现自己的散列专门化,例如,
std::hash
(这也非常容易,而且非常复杂)

一旦你可以散列你的密钥,你就可以把它扔进一个容器中,然后就可以使用它了。那东西很快

环路检测(2) 然后,您需要具有用于标识循环的短期数据结构,因此您需要一个在一端扩展但从不在另一端扩展的数据结构。这意味着您可能可以使用,如果您有非常大的实例,则可能可以使用(但请先尝试向量!)


我建议简单地将索引保持在局部向量的边上。您始终可以在无序地图中查找边对象。那么问题是如何表示索引。如果Int代表您的整数类型(例如,
Int
size\t
short
,…),那么使用一个可能是最一致的---如果整数的类型不同,您将需要一个。

为什么边由3个坐标描述?如果它总是3,为什么不使用固定大小的数组或结构?@Kindread True,它是二维的,但我开始描述我的系统,给每个单元格的中心2个坐标,然后是边,现在我的程序用单元格的前两个坐标和指向它的特定边的第三个坐标指向一条边。(以非冗余的方式……)如果你需要你的程序来处理你的单元格,除了知道边,我会考虑把细胞本身存储为类,并通过一个单元格上的方法调用找到一个单元格的边。每个边本身都可以表示为一个结构。我不熟悉晶格,但是如果它们总是有固定数量的边,那么可以将每个单元格的边作为另一个包含X边结构的结构返回,或者如果它们不固定,则可以返回包含在std::vector中的边。您应该将Edge struct/vector作为成员变量存储在cell对象上。@Liam如果您提到任何性能约束,那就好了。。一百万个细胞?速度?事实上,我需要能够在构建循环时迭代并添加边,直到回击第一条边(我只对闭合循环感兴趣)。对我来说,最方便的方法是以循环数组(类的实例)结束。每个循环都需要其中一个迭代结构来构造其几何体。另外,在我完成所有可能的循环之前,我不知道有多少循环,所以我需要我的循环数组是可消耗的/“可迭代的”。我不确定我是否真的正确解析了所有这些。但看来我向你提出了错误的建议。因此,您需要一个边缘对象的集合,它由三个整数组成的元组标识,并且需要对集合进行排序。这个假设正确吗?然后我可以用一个更好的建议来更新答案。是的,它和我要找的完全一样。@Liam:我已经编辑了我的答案。看看这是否对你有帮助。如果你不太明白的话,请告诉我。