std :: array的std :: array是否有连续的内存?

MrP*_*rik 9 c++ memory arrays allocation matrix

似乎,我发现如何在2行代码中轻松获得具有连续内存的普通2D数组:

template<int N, int M>
using Array2D = array<array<int, M>, N>;
Run Code Online (Sandbox Code Playgroud)

让我们来解决简单的任务交换最大和最小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;
    }
}
Run Code Online (Sandbox Code Playgroud)

我在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
Run Code Online (Sandbox Code Playgroud)

优点:

  • 只有2条简单的线条才能获得2D数组
  • 您通常可以访问元素 arr[2][2]
  • 您可以使用stl算法

缺点:

  • 此解决方案在调试模式下无法正常工作,我遇到了运行时错误 array iterators incompatible
  • 我不知道是否总是会连续分配内存
  • 我不知道它是否适用于其他编译器
  • 魔术迭代器

问题:

  • 连续分配是否Array2D由任何东西确保?
  • 是否有资格以这种方式使用数组迭代器?(不同的迭代器,但记住连续和指针实现)
  • Array2D在生产代码中以这种方式(如示例)使用是否安全?如果没有,你能用最少的代码开销呈现好的代码来解决这个任务吗?
  • geza:这个答案与嵌套数组的连续性相矛盾.也许在C++ 14中有些变化?

Ron*_*Ron 4

根据标准,内存应该是连续的。26.3.7.1 [array.overview]段落指出(强调我的):

标头定义了用于存储固定大小的对象序列的类模板。数组是一个连续的容器。数组的实例存储 N 个 T 类型的元素,因此 size() == N 是一个不变量。

更新:看来实现可能包括填充。有关该主题的更多信息,请参阅这些 SO 帖子:
Is the size of std::array Defined by standard?
特别是这个答案:
嵌套 std::arrays 中的数据保证是连续的吗?

  • 问题是每个“单独”数组都有连续的内容,但不同“std::array”元素之间的间隙是未定义的。因此,“数组的数组”的“连续性”充其量只是“块状”。 (2认同)
  • @geza `std::array` 可以在末尾有填充。 (2认同)