【发布时间】:2012-04-03 11:53:04
【问题描述】:
std::array<std::array<T,N>, M> 中的数据是否保证是连续的?例如:
#include <array>
#include <cassert>
int main()
{
enum {M=4, N=7};
typedef std::array<char,N> Row;
typedef std::array<Row, M> Matrix;
Matrix a;
a[1][0] = 42;
const char* data = a[0].data();
/* 8th element of 1D data array should be the same as
1st element of second row. */
assert(data[7] == 42);
}
断言是否保证成功?或者,换句话说,我可以依靠Row 的末尾没有填充吗?
编辑:为了清楚起见,对于这个例子,我希望整个矩阵的数据是连续的。
【问题讨论】:
-
即使存储是连续的,我相信您也会违反别名规则。请参阅我在很多个月前问过的这个问题(诚然,关于 C):stackoverflow.com/questions/6290956/…。
-
@LightnessRacesinOrbit :不,我不认为这是重复的。虽然单个
std::array中的数据是连续的,但这并不意味着嵌套std::arrays 中的整个数据集是连续的。或者至少对于像我这样的非语言律师来说并不明显。 -
@Emile:是的,确实如此。如果
std::array中的每个元素都是连续的,那么这意味着std::array<std::array<..>>中的每个std::array都直接与下一个元素相邻。而且,通过递归,每个“sub”-std::arrays 也是连续的。容器不会因为它是它自己的value_type而突然而神奇地失去连续性(如果确实是容器的保证)。 [编辑:但是,这与最里面的Ts 不同,它们都彼此相邻。看来这就是你的意思,所以,很好:P] -
@LightnessRacesinOrbit :就像詹姆斯在他的回答中所说的那样,
array<T>的末尾不需要填充或额外的数据成员,尽管我承认体面的实现不会这样做一件事。
标签: c++ multidimensional-array c++11