我知道如何通过分配器创建一个1d数组(如a[10]
)。例如,这是来自cppreference的摘要:
#include <memory>
#include <iostream>
#include <string>
int main()
{
std::allocator<int> a1; // default allocator for ints
int* a = a1.allocate(10); // space for 10 ints
a[9] = 7;
std::cout << a[9] << '\n';
// the remainder was omitted .....
return 0;
}
但是,我不知道如何创建像int a[10][10]
这样的2D数组。有人可以帮帮我吗?
答案 0 :(得分:2)
int[10][10]
是一个包含10个元素的数组类型。元素类型为int[10]
。所以相应的分配是:
std::allocator<int[10]> a2;
int (*a)[10] = a2.allocate(10);
您可以使用类型别名简化代码,例如:
using A = int[10];
std::allocator<A> a2;
A *a = a2.allocate(10);
请注意,cppreference示例错误地继续写入a[9] = 7;
。 allocate
函数分配存储但不在存储中创建对象。 (标准明确说明了这一点,C ++ 14表28)。将赋值运算符与不指定对象的左侧操作数一起使用是未定义的行为。在使用赋值运算符之前,您需要随后使用placement-new来创建对象。该示例现已修复为使用construct
而不是allocate
。
答案 1 :(得分:0)
您可以使用y * 10 + x分配100并进行访问。这是编译器为[10] [10]
生成索引的方式int* a = allocate(100);
a[5*10 + 2] = 9; //a[5][2]
答案 2 :(得分:0)
如果数组的大小是固定的,那么你可以简单地写
int a[10][10];
并且分配将在本地变量的堆栈上或全局变量的数据或bss段中(取决于您是否初始化数组成员)。
如果要动态分配数组的大小,我建议使用std::vector而不是数组。使用std :: allocator你会写
std::vector<std::vector<int>> a(10, std::vector<int>(10));
std::vector
也可以使用第二个模板参数来定义与std::allocator
不同的分配器。请注意,内存不是连续分配的。
here描述了具有连续数组大小的动态大小的2D数组的可能性。