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;
};