C++ std::array的std::array是否具有连续内存?
似乎,我发现了如何在两行代码中轻松获得具有连续内存的普通2D数组:C++ std::array的std::array是否具有连续内存?,c++,arrays,matrix,memory,allocation,C++,Arrays,Matrix,Memory,Allocation,似乎,我发现了如何在两行代码中轻松获得具有连续内存的普通2D数组: template<int N, int M> using Array2D = array<array<int, M>, N>; 我在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
template<int N, int M>
using Array2D = array<array<int, M>, N>;
我在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
优点:
- 只有2条简单的线才能得到二维数组
- 您通常可以通过
arr[2][2]
- 您可以使用stl算法
- 此解决方案在调试模式下无法正常工作,我发现运行时错误
数组迭代器不兼容
- 我不知道内存是否总是连续分配的
- 我不知道它是否适用于其他编译器
- 魔术迭代器
的连续分配是否有任何保证Array2D
- 以这种方式使用数组迭代器是否合格?(不同的迭代器,但请记住指针上的连续和实现)
在生产代码中以这种方式使用(如示例所示)安全吗?如果没有,您能否以最小的代码开销提供解决此任务的好代码Array2D
- :这与嵌套数组的连续性相矛盾。也许C++14中发生了一些变化
特别是这个答案:
内存将是连续的,但在
生成中(arr.front().begin(),arr.back().end())
您在两个不同的容器中使用迭代器,这是不允许的。您绝对不允许将其视为int的连续数组,但我非常确定连续内存布局是有保证的。@Boperson,是的,迭代器的概念是错误的,但\u数组\u迭代器
在指针上工作,所以它似乎不是这段代码是否因为迭代器的概念而不可接受?内存是连续的,但元素不需要连续(因为填充),因此混合来自不同数组元素的迭代器是未定义的行为(就像使用实际指针一样).Ha的可能重复,非常简单。array
连续放置N个连续的array
块,共M个元素,但由于某些原因,我害怕Array2D将是连续的。谢谢。关于迭代器的问题left@MrPisarik:这是矛盾的。也许C++14中有些东西已经改变了?@Ron:我保证f在std::array
的末尾没有填充。我不知道标准是怎么说的。但是我打赌一个健全的实现不会在那里做任何填充(但是如果标准不禁止的话,这种可能性仍然存在)。问题是每个单独的数组都有连续的内容,但不同的std::array
元素之间的间隙未定义。因此数组的连续性充其量是“块状的”。@geza Astd::array
可以在末尾加上填充。
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