[英]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.