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

时间:2013-10-14 10:35:52

标签: c++ data-structures

我目前正在格子上编码物理模拟,我有兴趣描述这个格子中的环,它们是由格子单元边缘组成的闭合曲线。我在三维布尔数组中存储关于这个格子单元的信息(通过信息我的意思是一个布尔变量,说明边缘是否有价值或者没有构成一个循环)。

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

但是,我绝对不太了解我必须做的结构选择,我的物理背景在C ++中没有教会我足够多。为此,我想听听你对这段代码的修改建议。我真的很喜欢发现一些编码这种孩子的新方法。

1 个答案:

答案 0 :(得分:1)

你想要两件事。一个是跟踪所有边缘并允许通过(int,int,int)索引快速查找边缘对象(您可能不希望int存在,但类似size_t之类的东西。这完全独立于你的第二个目标,这些目标是有序的子集。

一般收藏(1)

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

这有多容易,取决于各个整数的预期大小。也就是说,你可以设法每个整数不超过21位(例如,如果你的整数是short int值,只有16位),那么你可以将它们连接到一个64位值,这已经有了std::hash实施。stackable。否则,您必须实现自己的哈希特化,例如std::hash<std::array<uint32_t,3>>(这也非常简单,高度std::unordered_map)。

一旦你可以哈希你的密钥,你可以把它扔进std::vector并完成它。那件事是

环路检测(2)

然后,您希望使用短期数据结构来识别循环,因此您需要一个在一端扩展但从不在另一端扩展的数据结构。这意味着如果您有非常大的实例(但首先尝试向量!),您可能会使用std::deque或可能使用std::array<Int,3>

我建议简单地将索引保留在局部向量的边缘。您始终可以在unordered_map中查找边缘对象。那么问题是如何表示索引。如果Int表示您的整数类型(例如intsize_tshort,...),则使用std::tuple<...>可能是最一致的---如果类型为整数不同,你需要一个{{3}}。

相关问题