在下面的代码中,有一个Grid
其中包含points
。同样地,Element
and Face
也有points
但我想让他们指出points
in Grid
.
我应该使用智能指针还是原始指针?如果我使用智能指针我应该使用std::unique_ptr
or std::shared_ptr
?
struct Vector3
{
vector <double> dim;
Vector3 ()
{
dim.resize(3);
}
};
struct Element
{
vector <Vector3*> points;
};
struct Face
{
vector <Vector3*> points;
};
struct Grid
{
vector <Vector3> points;
vector <Element> elms;
vector <Face> faces;
};
Here您指定的前提条件是Element
and Face
对象被创建在Grid
对象与容器的元素引用相同Grid
容器,因此所有三个容器的生命周期(points
, elms
and faces
)是一样的。
现在你必须考虑两种情况。
半不可变points
在这种情况下,points
保证永远不会使其元素的引用无效(例如,它永远不会被修改)。这里不需要任何智能指针,只需使用一个简单的std::reference_wrapper
如下:
struct Vector3
{
std::vector<double> dim;
Vector3 () : dim(3) {}
};
template<class Type>
using ref_vec = std::vector<std::reference_wrapper<Type>>;
struct Element { ref_vec<Vector3> points; };
struct Face { ref_vec<Vector3> points; };
struct Grid
{
std::vector<Vector3> points;
std::vector<Element> elms;
std::vector<Face> faces;
};
另一个解决方案,与您的示例不等效(elms
and faces
没有直接访问Vector3
对象)可能是使用索引:
struct Vector3
{
std::vector<double> dim;
Vector3 () : dim(3) {}
};
struct Grid
{
struct Element { std::size_t point_indices; };
struct Face { std::size_t point_indices; };
std::vector<Vector3> points;
std::vector<Element> elms;
std::vector<Face> faces;
};
也就是说,您存储的索引points
.
Mutable points
如果执行的操作points
可以使引用无效,那么您可能需要考虑另一个不会使元素的引用/指针/迭代器无效的容器。
例如std::deque保证容器开头和结尾处删除/插入引用的有效性。
一旦您选择了正确的容器,您就可以应用与上面相同的想法。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)