2D向量数组的优势

3

之前,我一直使用指针创建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**
就我而言,向量需要更多的内存以换取数组大小更容易改变的优点。但由于我需要的二维数组用于网格的回溯算法(一旦确定其维度就不会改变),因此我不觉得有必要更改它们。
是否还存在其他我不知道的vector优点?

3
一个优点是你永远不需要记得调用delete - NathanOliver
2
另一个好处是,只要使用at函数,就可以大大降低未定义行为的风险。此外,请参见这里 - scohe001
如果内部向量具有恒定大小,则 vector<vector<Object>> 不好。在此基础上,将 vector<Object> 封装在某个类中,并通过运算符() (size_t row, size_t column) 访问元素。 - user2249683
即使您当前的方法并不像它应该的那样优化,但鉴于您声明了数组不会改变维度,您的实现可以通过仅调用两次 new(然后仅调用两次 delete)进行优化,而与行数无关。https://dev59.com/aWEh5IYBdhLWcg3w12ml#21944048 - PaulMcKenzie
1
此外,不要被任何声称vector“占用更多内存”的说法所分散注意力。这基本上是错误的,涉及到的额外内存非常小,你永远不会注意到它。另一方面,使用vector有无数的优点。事实上,你可能会编写更快(可能更节省内存)的代码,因为你将能够理解算法的大局并(安全地)朝着更好的算法推进。 - Aaron McDaid
2个回答

4

使用向量比原始数组有一些优势。首先,在向量超出范围时,您不必记得删除任何内容,因为向量会处理它。其次,向量具有许多内置成员函数,可以使生活更轻松,例如size()at()。第三,您可以使用基于范围的循环,并编写如下代码:

// 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

这看起来非常整洁且易于理解。


4

自动释放

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

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

关于开销

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

C++标准化

语言上的一致性很重要。如果你要使用C++标准库编写C ++,应尽可能接近它。我曾在许多地方工作过,那里混合了随机的C和C ++,使阅读和理解代码成为一场噩梦。


啊,那么 <vector> 就是你的救星了。 ;) - Colin Basnett

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接