[英]Does std::array of std::array have contiguous memory?
似乎,我发现如何用两行代码轻松获得具有连续内存的普通2D数组:
template<int N, int M>
using Array2D = array<array<int, M>, N>;
让我们解决在Array2D
中交换最小值和最大值的简单任务(c ++ 17的一部分):
template<int N, int M>
void printArray2D(const Array2D<N, M> &arr);
int main() {
const int N = 5;
const int M = 5;
Array2D<N, M> arr;
// random init of Array2D
generate(arr.front().begin(), arr.back().end(), []()->int {
return rand() % 100;
});
printArray2D(arr);
auto[a, b] = minmax_element(arr.front().begin(), arr.back().end());
cout << "Swap minimum and maximum: " << *a << " " << *b << endl << endl;
iter_swap(a, b);
printArray2D(arr);
return 0;
}
template<int N, int M>
void printArray2D(const Array2D<N, M> &arr) {
for (const auto &row : arr) {
for (const auto &elem : row) {
cout << std::setw(3) << elem;
}
cout << endl;
cout << endl;
}
}
我在Visual Studio 2017中得到了下一个结果:
41 67 34 0 69
24 78 58 62 64
5 45 81 27 61
91 95 42 27 36
91 4 2 53 92
Swap minimum and maximum: 0 95
41 67 34 95 69
24 78 58 62 64
5 45 81 27 61
91 0 42 27 36
91 4 2 53 92
优点:
arr[2][2]
缺点:
array iterators incompatible
问题:
根据标准,内存应该是连续的。 26.3.7.1 [array.overview]段落指出(强调我的意思):
标头定义用于存储固定大小的对象序列的类模板。 数组是一个连续的容器 。 数组的实例存储N个类型为T的元素,因此size()== N是不变量。
更新:看来实现可能包括填充。 这些SO帖子中提供了有关该主题的更多信息:
std :: array的大小是否由标准定义?
特别是这个答案:
嵌套std :: arrays中的数据是否保证是连续的?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.