C++ 为什么C&x2B+;STL也不包括多维数组?

C++ 为什么C&x2B+;STL也不包括多维数组?,c++,stl,containers,C++,Stl,Containers,我理解它们在C语言中的不足:可以将多维数组模拟为数组的数组,而无需任何开销。但是,在C++容器中,例如 vector < /C> >不太适合。尽管人们可以,而且(唉)通常会做一些类似于vector的事情,但这种结构可能会导致: (1) 维护问题,例如无法保证所有内部向量的大小相同 (2) 显著的内存开销,例如内部向量大小和数据指针的多个实例 (3) 由于行之间缺乏空间对齐,并且每行需要执行一次超出必要范围的间接内存访问,因此存在显著的性能缺陷 为什么每个开发人员都要通过编写自己的网格或矩阵来重新

我理解它们在C语言中的不足:可以将多维数组模拟为数组的数组,而无需任何开销。但是,在C++容器中,例如<代码> vector < /C> >不太适合。尽管人们可以,而且(唉)通常会做一些类似于
vector>
的事情,但这种结构可能会导致:

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

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

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


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

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

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


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

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

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

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

尽管很少使用(我当然不推荐使用),但该标准实际上包含了一些直接支持使用至少起到多维数组作用的东西

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

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

尽管很少使用(我当然不推荐使用),但该标准实际上包含了一些直接支持,用于使用至少起多维数组作用的东西

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


尽管如此,是的,
std::slice
std::gslice
提供了(例如)寻址一列(比如)3D数组的能力。

因为您还没有编写提案,提交给委员会,并主张将其纳入标准。疯狂的Eddie说,似乎没有任何提案符合标准,然而这是我所知道的两个最有前途的建议:因此使用
std::array
。当你选择错误的工具时,抱怨工具有缺陷是没有意义的。仅仅因为它不在标准库中并不意味着你必须自己编写。有很多实现。有很多不同的方法可以实现这一点。。罗少校?主修专栏?它是如何生长的?它应该返回延迟的求值表达式吗?哪些函数应该是
constexpr
?标准化一个只意味着人们在家庭作业中使用它,但在任何现实世界的应用程序中继续使用它。并不是说你自己的提案很难推出。因为你还没有写出提案,提交给委员会,并主张将其纳入标准。正如疯狂的埃迪所说,似乎还没有任何提案能够达到标准。这是我所知道的两个最有前途的建议:因此使用
std::array
。当你选择错误的工具时,抱怨工具有缺陷是没有意义的。仅仅因为它不在标准库中并不意味着你必须自己编写。有很多实现。有很多不同的方法可以实现这一点。。罗少校?主修专栏?它是如何生长的?它应该返回延迟的求值表达式吗?哪些函数应该是
constexpr
?标准化一个只意味着人们在家庭作业中使用它,但在任何现实世界的应用程序中继续使用它。这并不是说你很难推出自己的。