gpt4 book ai didi

c++ - : instantiate an object or use pointers 之间的最佳方式是什么

转载 作者:行者123 更新时间:2023-11-28 06:18:21 25 4
gpt4 key购买 nike

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

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

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

最佳答案

将点存储在 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);
}

最后,您将拥有一组唯一点和一组引用三角形对象,这些对象有效地具有指向唯一集中这些点的“指针”。

关于c++ - : instantiate an object or use pointers 之间的最佳方式是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29804545/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com