你想要两个不同的东西。一个是跟踪所有边缘并允许通过 (int,int,int) 索引快速查找边缘对象(您可能不希望int
那里,但类似size_t
左右)。这完全独立于您创建这些有序子集的第二个目标。
一般收藏 (1)
由于您的边缘数据库将是稀疏的(即只有少数可能的索引实际上会识别为特定边缘),因此我之前使用 3d 矩阵的建议是不合适的。相反,您可能希望使用散列图查找边。
这有多容易,取决于各个整数的预期大小。也就是说,您能否设法使每个整数不超过 21 位(例如,如果您的整数是short int
只有 16 位的值),那么您可以将它们连接到一个已经有std::hash
实现的 64 位值。否则,您将不得不实现自己的哈希专业化,例如std::hash<std::array<uint32_t,3>>
(这也很容易,并且高度可堆叠)。
一旦你可以散列你的密钥,你就可以把它扔进一个std::unordered_map
并完成它。那东西很快。
环路检测 (2)
然后,您希望拥有用于识别循环的短期数据结构,因此您需要一种在一端扩展但从不在另一端扩展的数据结构。这意味着如果您有非常大的实例,您可能对 anstd::vector
或可能对 anstd::deque
没问题(但请先尝试向量!)。
我建议简单地将索引保持在本地向量的边缘。您始终可以在 unordered_map 中查找边缘对象。那么问题是如何表示索引。如果 Int 表示您的整数类型(例如int
, size_t
, short
, ...),那么使用 --- 可能是最一致的,std::array<Int,3>
如果整数的类型不同,您将需要一个std::tuple<...>
.