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

时间:2015-12-17 21:48:11

标签: c++ stl containers

我理解他们缺乏C:可以将多维数组模仿为没有开销的数组数组。但是,在C ++中,vector等容器并不适合这种情况。虽然可以,(唉)通常做类似vector< vector< double > >的事情,但这样的结构可能会导致:

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

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

(3)显着的性能缺陷,由于行之间缺乏空间对齐以及每行必须进行一次间接内存访问的必要性。

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

2 个答案:

答案 0 :(得分:2)

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

此处的一个问题是,所包含的支持仅适用于std::valarray,而不适用于std::vector。另一个问题是大多数能力的文档都很差,因此通常很难理解提供的内容实际上是多维数组功能。另一个问题是使用vallarray(以及几乎所有相关的)往往在笨拙的一面充其量 - 每隔一段时间你会遇到奇怪的限制,表明它从未真正完成。< / p>

尽管如此,是的,std::slicestd::gslice提供了(例如)解决3D数组列的能力。

答案 1 :(得分:1)

因为程序员通常并不那么迫切地需要它们。如果我想要的是具有相同大小的行的二维(或N维)矩阵,每次我只使用覆盖整个矩阵的一维数组(并且作为奖励,它对于记忆位置也更好)。当然,它需要手动计算指数,但计算非常简单(matrix[r*row_size+c])。如果需要,甚至可以轻松填充。

是的,对于更加花哨的东西,Boost中已经有一些实现。

我真正需要一个真正的多维数组的少数情况之一就是“行”的大小不一样。