2D矢量阵列的优点

时间:2015-07-21 19:47:21

标签: c++ arrays vector

以前,我使用指针创建了类Object的2D数组,语法如下:

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

但是,很多人建议我使用vector<vector<Object>>而不是Object**

就我而言,矢量需要更多的记忆作为权衡,以便更容易地改变阵列大小。 但是,由于我需要的2D数组用于网格的回溯算法(一旦确定它就永远不会改变它的尺寸),我觉得不需要改变它们。

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

2 个答案:

答案 0 :(得分:3)

使用矢量而不是原始数组有一些优点。首先,你不必记住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

这看起来很干净,也很容易理解。

答案 1 :(得分:1)

自动释放

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

显然,如果您的vectors包含使用newmalloc分配的对象,则需要正常删除它们。这是shared_ptr进来的地方,但这是另一个主题。

关于开销

虽然每个向量都有轻微的开销,但与传统的C风格数组相比,它更符合C ++范例。如果您的向量具有固定大小,您还可以使用std::array<T, N>,并避免使用动态大小容器带来的大量开销。

C ++ - 岬

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