以下之间的最佳方法是:实例化对象或使用指针

时间:2015-04-22 17:12:46

标签: c++ opengl

我们想要从STL模式已经存在的列表中创建我们自己的三角形列表(它是一个由三角形组成的3D几何模型),几个三角形可以有相同的点,我们想要使用最佳解决方案:< / p>

S1)遍历列表,使用此列表的每个三角形(元素)的坐标创建一个三角形对象,然后将它放在我们的列表中(胜利者)。但是这里必须多次创建点,因为正如我所说的,许多三角形可以有相同的点。

S2)已经存在另一个包含所有点的列表,然后它通过已经存在的三角形列表,并且对于每个三角形点我们在点列表中搜索它(所以我们必须使用排序和搜索算法)使用指针(指向这些点)并创建符合3个指针(* p1,* p2,* p3)的对象并将它们放入我们的列表中。

1 个答案:

答案 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);
}

最后,您将拥有一组独特的点和一组参考三角形对象,这些对象实际上具有指向唯一集合中这些点的“指针”。