C++和STL都不包含多维数组的原因是什么

What are the reasons why neither C++ nor STL includes multidimensional arrays?

本文关键字:数组 是什么 包含多 STL C++      更新时间:2023-10-16

我理解它们在C中的不足:可以将多维数组模拟为无开销的数组数组。然而,在C++中,像vector这样的容器不太适合这样做。尽管人们可以,而且(唉)通常会做类似vector< vector< double > >的事情,但这样的构造可能会导致:

(1) 维护问题,例如无法保证所有内部vector具有相同的大小;

(2) 显著的内存开销,例如内部向量大小和数据指针的多个实例;

(3) 由于行之间缺乏空间对齐,并且每行需要进行一次间接内存访问,因此存在显著的性能缺陷。

为什么每个开发人员都要通过编写自己的gridmatrix来重新发明轮子?

尽管它很少使用(我当然不建议使用),但该标准实际上包括了一些对使用至少像多维数组一样的东西的直接支持。

这里的一个问题是,所包含的支持仅适用于std::valarray,而不是std::vector。另一个问题是,大多数关于该功能的文档都很差,因此通常很难理解所提供的实际上是多维阵列功能。另一个问题是,使用vallarray(以及几乎所有相关的东西)充其量也有点笨拙——偶尔你会遇到一些奇怪的限制,这表明它从未真正完成。

尽管如此,是的,std::slicestd::gslice提供了(例如)寻址3D阵列的列的能力。

因为程序员通常并不迫切需要它们。如果我想要的都是一个行大小相等的二维(或N维)矩阵,那么每次我都只使用覆盖整个矩阵的一维数组(作为奖励,它对内存局部性也更好)。当然,这需要手动计算索引,但计算非常简单(matrix[r*row_size+c])。如果需要,甚至可以很容易地填充。

是的,对于更奇特的东西,Boost中已经有一些实现可用。

我真正需要一个真正的多维数组的少数情况之一是,如果"行"的大小不相等。