C++和STL都不包含多维数组的原因是什么
What are the reasons why neither C++ nor STL includes multidimensional arrays?
我理解它们在C中的不足:可以将多维数组模拟为无开销的数组数组。然而,在C++中,像vector
这样的容器不太适合这样做。尽管人们可以,而且(唉)通常会做类似vector< vector< double > >
的事情,但这样的构造可能会导致:
(1) 维护问题,例如无法保证所有内部vector
具有相同的大小;
(2) 显著的内存开销,例如内部向量大小和数据指针的多个实例;
(3) 由于行之间缺乏空间对齐,并且每行需要进行一次间接内存访问,因此存在显著的性能缺陷。
为什么每个开发人员都要通过编写自己的grid
或matrix
来重新发明轮子?
尽管它很少使用(我当然不建议使用),但该标准实际上包括了一些对使用至少像多维数组一样的东西的直接支持。
这里的一个问题是,所包含的支持仅适用于std::valarray
,而不是std::vector
。另一个问题是,大多数关于该功能的文档都很差,因此通常很难理解所提供的实际上是多维阵列功能。另一个问题是,使用vallarray
(以及几乎所有相关的东西)充其量也有点笨拙——偶尔你会遇到一些奇怪的限制,这表明它从未真正完成。
尽管如此,是的,std::slice
和std::gslice
提供了(例如)寻址3D阵列的列的能力。
因为程序员通常并不迫切需要它们。如果我想要的都是一个行大小相等的二维(或N维)矩阵,那么每次我都只使用覆盖整个矩阵的一维数组(作为奖励,它对内存局部性也更好)。当然,这需要手动计算索引,但计算非常简单(matrix[r*row_size+c]
)。如果需要,甚至可以很容易地填充。
是的,对于更奇特的东西,Boost中已经有一些实现可用。
我真正需要一个真正的多维数组的少数情况之一是,如果"行"的大小不相等。
- C++数组是如何识别的
- 使用嵌套函数数组是个好主意吗?
- 将任意对象附加到数组有什么问题
- 如何检查字节数组是protobuf序列化字节数组还是普通字节数组
- 堆指针不会被分配给数组有什么原因吗
- Getter 函数,用于在 2d 数组是类的数据成员时检索 2d 数组元素
- 数组是如何通过引用、值或指针传递C++的?
- 构建对象数组是如何工作的?我被这个例子困住了
- 你不能在 void 指针上使用指针算法,那么 void 指针数组是如何工作的呢?
- C/C++ 中的常量数组和静态常量数组有什么区别
- 为什么当将 short[] 转换为字符*时,数组是反转的?
- 从一系列的evens和赔率中,新数组是持续的第一个赔率
- 数组是通过引用传递的,但是如果我只传递未存储在内存中的数组的值,会发生什么
- VB6 相当于 C++ 个字符数组是什么?
- 字符串数组[] = " " 是什么;意思是,为什么它有效?
- 传递枚举数组是什么意思
- 为什么有人告诉我数组是指针?C++中数组和指针之间的关系是什么
- c++中传递裸数组是什么意思?
- 什么时候变长数组是合法的?
- 如何编写一个函数,无论数组是什么类型都输出它