使用智能指针或原始指针

2023-12-06

在下面的代码中,有一个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(使用前将#替换为@)

使用智能指针或原始指针 的相关文章

随机推荐