Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/160.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将嵌套的std::数组视为具有chained.data()的单个平面数组_C++_C++11 - Fatal编程技术网

C++ 将嵌套的std::数组视为具有chained.data()的单个平面数组

C++ 将嵌套的std::数组视为具有chained.data()的单个平面数组,c++,c++11,C++,C++11,假设我有一个小的固定维矩阵类: template<size_t M, size_t N> struct MatMN { std::array<std::array<double, N>, M> rows; double* begin() { return rows.data()->data(); } //The scary part double* end() { return begin() + M*N; } //const iter

假设我有一个小的固定维矩阵类:

template<size_t M, size_t N>
struct MatMN { 
  std::array<std::array<double, N>, M> rows;
  double* begin() { return rows.data()->data(); } //The scary part
  double* end() { return begin() + M*N; }
  //const iterators, etc.
};
模板
结构MatMN{
std::数组行;
double*begin(){return rows.data()->data();}//可怕的部分
double*end(){return begin()+M*N;}
//常量迭代器等。
};
而不是使用嵌套循环,我实现了标量乘法(也包括等式测试、二进制反序列化等),如下所示:

模板
MatMN运算符*(双标量,MatMN mat){
对于(double&x:mat){x_*=scalar;}
返回垫;
}
通过使用
.data()->data()
,将嵌套的
std::array
s视为一个单一的平面C样式数组,实际上可以吗

我是否面临一些严格的别名问题?或者可能在单个
std::array
s的末尾出现意外的结构填充(即矩阵行之间)?到目前为止,它对我来说是很好的(用GCC),但我知道这并不意味着在C++中。

使用.data()->data()将嵌套的std::数组视为单个平面C样式数组,实际上可以吗

否。
std::array
允许在末尾添加填充。这意味着嵌套结构中一个数组的结束位置与另一个数组的开始位置之间可能存在间隙。像您这样获取指针(如果有填充)将导致您访问该填充,从而得到未定义的结果

不要将矩阵存储在2d
std::array
中,而应该使用1d
std::array
。这样,您就可以保证元素在内存中彼此相邻

template<size_t M, size_t N>
MatMN<M, N> operator*(double scalar, MatMN<M, N> mat) {
  for (double& x_ : mat) { x_ *= scalar; }
  return mat;
}