【问题标题】:array of 2 dimensions, one being known and the other unknown二维数组,一个是已知的,另一个是未知的
【发布时间】:2019-04-17 16:11:05
【问题描述】:

我需要有效地分配一个二维数组,一个是已知的 (5),另一个是未知的。

我的目标是拥有一个名为 block 的连续内存块,以下列方式存储我的数据: 块[0,0] 块[0,1] 块[0,2] 块[0,3] 块[0,4] 块[1,0] ...]

以下代码编译(在 C++ 中):

unsigned int size2=200;
auto block = new float[size2][5];

正确吗? 变量块的类型是什么? 我试过了:

float[5]* block = new float[size2][5];
float[5] block[] = new float[size2][5];
float block[][5] = new float[size2][5];
float block*[5] = new float[size2][5];

所有这些都会导致错误。 我已经没有想象力了......

【问题讨论】:

  • 如何创建指针数组,每个指针指向一个动态数组?
  • 它分配额外的内存并将分配的内存碎片
  • 什么不使用向量?

标签: c++ arrays types


【解决方案1】:
unsigned int size2=200;
auto block = new float[size2][5];

正确吗?

是的,它是正确的。

变量块的类型是什么?

在这里使用auto 是您能做的最好的事情。但出于学习目的,block 的类型是float(*)[5]。要定义具有该类型的变量,您必须使用以下语法:

unsigned int size2=200;
float(*block)[5] = new float[size2][5];

演示:https://godbolt.org/z/4iJMA5


“我怎样才能读到像float(*block)[5] 这样的东西?”你可能会问。很简单,使用C++ Guru Snail Rule

【讨论】:

  • 你可以做类似的事情来定义一个typedef 允许一个更自然的指向数组的指针分配,例如typedef float row_t[5]; ... row_t *block = new row_t[200];(是否更清楚尚待商榷)
【解决方案2】:
unsigned int size2=200;
auto block = new float[size2][5];

对吗?

是的,尽管裸露的拥有指针是个坏主意。动态数组最好使用std::vector

变量块的类型是什么?

它是float (*)[5],即指向 5 个浮点数的数组的指针。


正如我所提到的,我建议使用 std::vector 来避免内存管理的陷阱:

std::vector<std::array<float, 5>> block(size2);

【讨论】:

    【解决方案3】:

    我有点老派,但最简单的是真的

    new float[size2 * 5];
    

    并使用

    访问它
    my_array[y * 5 + x]
    

    您甚至可以添加内联辅助函数

    int at(int x, int y) { return y * 5 + x;}
    

    ...

    my_array[at(x,y)]
    

    理想情况下与 std::vector 结合,而不是动态数组。

    【讨论】:

    • 我看不出这比提问者自己的版本更好。使用它更复杂。
    猜你喜欢
    • 2023-01-10
    • 1970-01-01
    • 2021-04-17
    • 2023-03-12
    • 1970-01-01
    • 2010-12-10
    • 2019-07-13
    • 1970-01-01
    • 2021-06-04
    相关资源
    最近更新 更多