c++ - 对于类中动态大小的数组,std::vector 是否优于堆数组?

标签 c++ arrays vector

如果你想将数组作为类的成员变量,有两个主要选项:

A:在堆上分配内存

class X
{
    int * arr;
public:
    UnionFind(int numNodes)
    {
        arr = new int[numNodes];
    }
}

B:使用 vector

class X
{
    vector <int> arr;
public:
    UnionFind(int numNodes)
    {
        arr.resize(numNodes);
    }
}

以下哪个是首选方法?我知道堆分配数组的一个缺点是您需要自己注意删除内存。

作为一个小问题,如果在堆上创建 X 的对象是 vector <int> arr也在堆内对象?如果是,怎么会vector <int> arr不需要手动删除?

最佳答案

当您在动态分配的 C 样式数组和 std::vector<> 之间做出选择时, 选择 vector 。

  • 这是安全的,为您完成所有的分配/重新分配/调整大小
  • 它使您的代码更灵活、可读性更强且更易于维护
  • 它在大多数用例中都非常高效
  • 它提供显式迭代器和大量成员函数,包括 size()
  • 许多实现会在 Debug模式下进行索引检查以捕获越界错误

请注意 std::array存在于大多数情况下 C 数组更可取(例如,当首选堆栈上的分配时)

关于c++ - 对于类中动态大小的数组,std::vector 是否优于堆数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24133239/

相关文章:

arrays - 直接访问R中data.frame中的Vector元素?

c++ - 使用 SSE 操作时的内存访问冲突

c++ - 如何使用 C++ 库找出 HDF5 中数据集的 PredType

c++ - 隐藏多个 CMFCEditBrowseCtrl 的文件浏览按钮

c++ - 是否可以制作非 POD 类型的流?

c++ - 64位和32位无符号整数双向映射的高效实现

c# - 在 C# 中使用枚举索引数组

ios - Swift2 中的一组数组

python - 将 numpy 数组分解为二进制数组

ios - 如何在 spriteKit 中以特定角度施加力?