结构中的向量 - 最佳方法? C ++

时间:2011-06-06 00:07:43

标签: c++ vector struct

我试图在我的结构中包含一个向量。

这是我的结构:

struct Region 
{
    bool hasPoly;
    long size1; 
    long size2;
    long size3;
    long size4;
    long size5;
    long size6;
    //Mesh* meshRef; // the mesh with the polygons for this region
    long meshRef;
    std::vector<int> PVS;
} typedef Region;

此声明中的向量是有效还是更有意义地指向向量。在指向矢量的指针的情况下,我是否需要分配新的矢量。我该如何做到这一点?

谢谢!

编辑:问题是它最终导致错误指向xmemory.h,这是MSVC ++平台附带的一个文件。

    void construct(pointer _Ptr, _Ty&& _Val)
        {   // construct object at _Ptr with value _Val
        ::new ((void _FARQ *)_Ptr) _Ty(_STD forward<_Ty>(_Val)); // this is the line
         }

有趣的是,如果我将它分配到结构之外并且只是在我使用的函数中,它就不会发生。有什么想法吗?

4 个答案:

答案 0 :(得分:5)

你可以不用typedef这样写它:

struct Region 
{
    bool hasPoly;
    long size1; 
    long size2;
    long size3;
    long size4;
    long size5;
    long size6;
    long meshRef;
    std::vector<int> PVS;
}; // no typedef required

回答你的问题:

  

此声明中的向量是否有效

是的,是的。

  

或者做一个指向矢量的指针会更有意义。

不,可能不是。如果您这样做,则必须为复制行为实现复制构造函数,赋值运算符和析构函数。你最终会得到同样的结果,但这将是额外的工作并可能引入错误。

  

在指向矢量的指针的情况下,我是否需要分配新的矢量。我该如何做到这一点?

您需要实现复制构造函数复制赋值运算符析构函数

// Copy constructor
Region(const Region & rhs) :
    hasPoly(rhs.hasPoly),
    // ... copy other members just like hasPoly above, except for PVS below:
    PVS(new std::vector<int>(*rhs.PVS))
{
}

// Copy assignment operator
Region & operator=(const Region & rhs)
{
    if (this != &rhs)
    {
         hasPoly = rhs.hasPoly;
         // ... copy all fields like hasPoly above, except for PVS below:

         delete PVS;
        PVS = new std::vector<int>(*rhs.PVS);
    }
    return *this;
}

// Destructor
Region::~Region()
{
    delete PVS;
}

底线:你的代码很好。你不需要改变它。

编辑:修复赋值运算符:检查与此对比并返回* this。

答案 1 :(得分:3)

这样做是完全合理的,并且在任何方面你都不需要new,除非你真的想要别名一个单独的向量。此外,您不需要在此处进行任何typedef内容。

答案 2 :(得分:2)

这取决于你如何使用它。

如果要在复制Region结构时复制矢量和数据,请将其保留为非指针。

如果你不想复制它,那么你需要某种指向矢量的指针。

如果使用指向向量的指针,则应该非常小心分配/释放异常安全性。如果您无法以异常安全的方式确定分配范围,那么您将留下内存泄漏的可能性。

有几种选择:

  • 确保分配向量的代码(并使用Region)也会释放向量,并且本身是异常安全的。这将要求Region仅存在于该代码的范围内 您可以通过简单地在堆栈上分配向量,并将其传递给Region中的指针来完成此操作。然后确保永远不会在该堆栈框架上方返回Region对象。
  • 你也可以使用某种智能指针 - &gt;你Region
  • 中的矢量

答案 3 :(得分:1)

矢量很好。请注意,如果复制此结构,则将使用它复制向量。因此,在具有特定性能约束的代码中,以与处理任何其他昂贵的复制类型相同的方式处理此结构。

在生产代码中,有些人希望您使用class关键字而不是struct关键字来定义此类,因为vector成员使其成为非POD。如果您是自己风格指南的作者,则无需担心。

typedef错误,只需写struct Region { stuff };