2017-04-24 80 views
2

我知道如何通过分配器创建1d数组(如a[10])。举例来说,这里是从cppreference抽象:如何为int a [10] [10]分配内存分配器

#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]。有人可以帮我解决这个问题吗?

+2

这不是'C' .. –

+0

[我如何在C++中使用new声明一个2d数组](http://stackoverflow.com/questions/936687/how-do-i-declare-a-2d- array-in-c-using-new) – Rogus

回答

0

您可以改为使用y * 10 + x来分配100和访问。编译器如何生成索引[10] [10] [012]

int* a = allocate(100); 
a[5*10 + 2] = 9; //a[5][2] 
2

int[10][10]是10个元素的数组类型。元素类型是int[10]。这样配置的相当于是:

std::allocator<int[10]> a2; 
int (*a)[10] = a2.allocate(10); 

你可以简化代码与一个类型别名,e.g:

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

+0

当分配存储空间时,int的生存期开始:[basic.life] p1.1 – Cubbi

+0

@Cubbi该部分表示*如果创建int对象的代码被执行*,则该int对象的生命周期的开始点是分配存储的时间点。只分配存储空间不会创建任何特定的对象。如果你在你的图片中创建一个int或一个浮点数的malloc 4字节? (我看到有人认为它会创建一个叠加的所有可能的4字节对象的每个对象!)无论如何,我不希望在评论中有这个参数,我会引用你[这个答案](http:// stackoverflow .com/a/40874245/1505939)进行标准参考和讨论 –

+0

哦,这个讨论。我认为与C无关不兼容是一个缺陷,但我同意不管在哪里调用allocator :: construct都是好主意。cppreference更新,谢谢。 – Cubbi

0

如果数组的大小是固定的,那么您可以简单地写

int a[10][10]; 

和分配将是堆栈为局部变量或全局变量的数据或bss段上(取决于你是否初始化数组成员或不)。

如果你想分配动态数组的大小,我会建议使用std::vector而不是数组。使用的std ::分配器你会写

std::vector<std::vector<int>> a(10, std::vector<int>(10)); 

std::vector也可以采取第二个模板参数来定义从std::allocator不同的分配。请注意,内存不会连续分配。

描述了具有连续阵列大小的动态大小2D阵列的可能性here