C++ 使用智能指针或原始指针
在下面的代码中,有一个C++ 使用智能指针或原始指针,c++,pointers,c++11,vector,C++,Pointers,C++11,Vector,在下面的代码中,有一个网格,其中包含点。同样地,元素和面也有点,但我想让它们指向网格中的点 我应该使用智能指针还是原始指针。如果我使用智能指针,我应该使用std::unique\u ptr还是std::shared\u ptr struct Vector3 { vector <double> dim; Vector3 () { dim.resize(3); } }; struct Element { vector <V
网格
,其中包含点
。同样地,元素
和面
也有点
,但我想让它们指向网格中的点
我应该使用智能指针还是原始指针。如果我使用智能指针,我应该使用std::unique\u ptr
还是std::shared\u 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;
};
struct Vector3
{
向量dim;
向量3()
{
调整尺寸(3);
}
};
结构元素
{
矢量点;
};
结构面
{
矢量点;
};
结构网格
{
矢量点;
向量榆树;
向量面;
};
您指定先决条件是在网格
对象中创建元素
和面
对象,容器的元素引用相同的网格
容器,因此所有三个容器(点
、ELM
和面
)的寿命是一样的
现在你必须考虑两种情况。
半不变点
在这种情况下,点
保证永远不会使对其元素的引用无效(例如,它永远不会被修改)。在这里,您不需要任何智能指针,只需使用一个简单的std::reference\u包装器即可,如下所示:
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;
};
也就是说,存储点的索引
可变点
如果在<代码>点>代码>上执行的操作会使引用无效,那么您可能需要考虑另一个容器,该容器不会使引用/指针/迭代器失效。
例如,保证在容器的开头和结尾处删除/插入引用的有效性
一旦您选择了正确的容器,您就可以应用与上述相同的思想。这取决于:]例如,网格
与元素
的生命周期是多少?是否在某个时候从网格中删除点
,但仍需要从元素
中访问?等等。还有,网格的向量是否被调整大小。Vector3包含什么?@dyp:Grid
可能会在程序执行过程中被删除。@PeteKirkham:我从数据文件中读取了Grid.points
的大小。自reference\u wrapper
没有默认构造函数以来,第一个案例会编译吗?@Shibli。未创建std::reference\u包装器对象。
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;
};