我们想要从STL模式已经存在的列表中创建我们自己的三角形列表(它是一个由三角形组成的3D几何模型),几个三角形可以有相同的点,我们想要使用最佳解决方案:< / p>
S1)遍历列表,使用此列表的每个三角形(元素)的坐标创建一个三角形对象,然后将它放在我们的列表中(胜利者)。但是这里必须多次创建点,因为正如我所说的,许多三角形可以有相同的点。
S2)已经存在另一个包含所有点的列表,然后它通过已经存在的三角形列表,并且对于每个三角形点我们在点列表中搜索它(所以我们必须使用排序和搜索算法)使用指针(指向这些点)并创建符合3个指针(* p1,* p2,* p3)的对象并将它们放入我们的列表中。
答案 0 :(得分:1)
将点存储在std::unordered_set
中,然后将三角形存储为包含3个std::unordered_set::const_iterator
的结构列表。
将点插入集合将是近似恒定的时间,插入返回包含可以找到该点的迭代器的对。
有关插件如何工作的更多详细信息,请查看here。
这是代码的基本结构(未经测试)
struct Point
{
float x;
float y;
float z;
};
typedef std::unordered_set<Point, int, hashFunc, equalsFunc> pset;
// Note, see http://stackoverflow.com/questions/16792751/hashmap-for-2d3d-coordinates-i-e-vector-of-doubles for more details on how to store complex structures in unordered_sets
struct RefTriangle
{
pset::const_iterator p[3];
};
pset allPoints;
std::list<RefTriangle> refTriangles
for (const Triangle& t : triangleList)
{
RefTriangle rt;
rt.p[0] = allPoints.insert(t.p1).first;
rt.p[1] = allPoints.insert(t.p2).first;
rt.p[2] = allPoints.insert(t.p3).first;
refTriangles.push_back(rt);
}
最后,您将拥有一组独特的点和一组参考三角形对象,这些对象实际上具有指向唯一集合中这些点的“指针”。