以前,我使用指针创建了类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
还有其他任何优势吗?
答案 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
包含使用new
或malloc
分配的对象,则需要正常删除它们。这是shared_ptr
进来的地方,但这是另一个主题。
虽然每个向量都有轻微的开销,但与传统的C风格数组相比,它更符合C ++范例。如果您的向量具有固定大小,您还可以使用std::array<T, N>
,并避免使用动态大小容器带来的大量开销。
语言的一致性非常重要。如果您要使用标准库编写C ++,您应该尽可能地坚持使用。我曾经在很多地方工作,使用C和C ++混合在一起的随机大杂烩,这使得阅读和理解代码成为一场噩梦。