【问题标题】:Advantages of 2D vector array二维向量数组的优点
【发布时间】:2015-07-21 19:47:21
【问题描述】:

以前,我一直在使用指针创建类Object 的二维数组,语法如下:

Object** myArray = new Object*[row_num];
for (int i = 0; i < row_num; i++)
{
    myArray[i] = new Object[col_num];
    [skip]
}

但是,很多人一直建议我使用vector&lt;vector&lt;Object&gt;&gt; 而不是Object**

就我而言,向量需要更多内存作为权衡,以便更轻松地更改数组大小。 但是,由于我需要的二维数组用于网格的回溯算法(一旦确定它就永远不会改变它的维度),我觉得没有必要改变它们。

vector 还有其他我不知道的优势吗?

【问题讨论】:

  • 一个好处是你永远不需要记得打电话给delete
  • 另一个是,只要你使用at 函数,你就可以大大减少未定义行为的机会。另见here
  • 如果内部向量具有恒定大小,则 vector&lt;vector&lt;Object&gt;&gt; 不好。有了这个,在一些类中封装一个vector并通过运算符()访问元素(size_t行,size_t列)
  • 即使您当前的方法也确实没有达到最佳效果。鉴于您声明您的数组不会改变维度,您的实现可以通过只调用 2 次 new(然后只调用 2 次 delete)来优化,无论行数如何。 stackoverflow.com/questions/21943621/…
  • 另外,不要被vector“占用更多内存”的说法分心。这本质上是错误的,所涉及的额外内存将很小,您永远不会注意到它。另一方面,vector 有无数辉煌的优势。事实上,您可能会使用vector 编写更快(并且可能更节省内存)的代码,因为您将能够了解您的算法的大局并(安全地)推动更好的算法。

标签: c++ arrays vector


【解决方案1】:

与原始数组相比,使用向量有一些优势。首先,您不必记住 delete 任何内容,因为当向量超出范围时,它会处理这些。其次,向量有很多内置的成员函数,像size()at() 这样让生活更轻松。第三,您可以使用基于范围的 for 循环,您可以编写如下代码:

// print out all elements in a jagged 2d structure
std::vector<std::vector<int>> data;
//  load data into data
for (const auto & row : data)
    for (const auto & elem : row)
        //print out elem

这看起来非常干净且易于理解。

【讨论】:

    【解决方案2】:

    自动解除分配

    正如@NathanOliver 提到的,您永远不需要为多维向量调用delete(通常是自定义递归删除),因为内部的对象会在它们自动超出范围时被释放.这可以显着减少您需要编写和维护的代码量。

    显然,如果您的vectors 包含使用newmalloc 分配的对象,您需要正常删除它们。这就是shared_ptrs 的用武之地,但这是另一个话题。

    关于开销

    虽然每个向量都有一个轻微的开销,但使用它们而不是传统的 C 样式数组更符合 C++ 范例。如果你的向量是固定大小的,你也可以使用std::array&lt;T, N&gt;,并避免使用动态大小的容器带来的大量开销。

    C++ 特性

    语言的一致性很重要。如果您打算使用标准库编写 C++,您应该尽可能地坚持这一点。我曾在许多地方工作过,将 C 和 C++ 的随机大杂烩混合在一起使用,这让阅读和理解代码成为一场噩梦。

    【讨论】:

    • 啊,那么&lt;vector&gt;s 就是你的票了。 ;)
    猜你喜欢
    • 2021-01-31
    • 2016-08-26
    • 1970-01-01
    • 2018-02-26
    • 2015-08-27
    • 1970-01-01
    • 2021-10-02
    • 1970-01-01
    相关资源
    最近更新 更多