使用智能或原始指针

时间:2014-06-04 23:44:05

标签: c++ pointers c++11 vector

在下面的代码中,Grid包含points。同样,ElementFace也有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;
};    

1 个答案:

答案 0 :(得分:3)

Here您指定前提条件是在Element对象中创建FaceGrid个对象,其中容器的元素引用相同的{{1}容器,因此所有三个容器(Gridpointselms)的生命周期都是相同的。

现在你必须考虑两种情况。

半不可变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保证容器开头和结尾的删除/插入引用的有效性。

选择正确的容器后,您可以应用与上述相同的想法。