似乎,我发现如何在2行代码中轻松获得具有连续内存的普通2D数组:
template<int N, int M>
using Array2D = array<array<int, M>, N>;
让我们解决Array2D
中的交换min和max 的简单任务(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
问题:
答案 0 :(得分:1)
根据标准,内存应该是连续的。 26.3.7.1 [array.overview]段指出(强调我的):
标题定义了用于存储固定大小的类模板 对象序列。数组是连续容器。一个实例 数组存储N个类型为T的元素,因此size()== N是一个 不变的。
更新:实现可能包含填充。
这些SO帖子中有关该主题的更多信息:
Is the size of std::array defined by standard?
特别是这个答案:
Is the data in nested std::arrays guaranteed to be contiguous?