在下面的代码中,Grid
包含points
。同样,Element
和Face
也有points
,但我希望他们指向points
中的Grid
。
我应该使用智能指针还是原始指针。如果我使用智能指针,我应该使用std::unique_ptr
还是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;
};
答案 0 :(得分:3)
Here您指定前提条件是在Element
对象中创建Face
和Grid
个对象,其中容器的元素引用相同的{{1}容器,因此所有三个容器(Grid
,points
和elms
)的生命周期都是相同的。
现在你必须考虑两种情况。
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
无法直接访问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
如果对points
执行的操作可能使引用无效,那么您可能需要考虑另一个不会使该元素的引用/指针/迭代器无效的容器。
例如std::deque
保证容器开头和结尾的删除/插入引用的有效性。
选择正确的容器后,您可以应用与上述相同的想法。