我需要一个二维数组,在C ++中有一个动态维度

时间:2017-09-26 18:55:24

标签: c++ arrays

我需要创建一个二维数组,其中有8行"行"但是"列"没有预先确定

沿着这个例子:

[0], ['mum', 'dad', 'uncle']
[1], ['brother', 'sister']
[2], ['friend', 'colleague', 'boss', 'employee']
.... and so on

比我必须滚动第一个索引(1到8)并读取所有列的每个可能值(对于每个"索引"我有多少元素在其中的计数。

我需要阅读类似

的内容
ary[2][3]    --->that would return "boss"

按照其他例子我正在使用

unsigned char (*ary)[n] = malloc(sizeof(unsigned char[8][n]));

但它没有编译并给出:

  

错误:无法初始化类型' unsigned char **'         rvalue类型' void *'

请问我是否在C ++中正确地声明并读取了这种数组?

3 个答案:

答案 0 :(得分:1)

如果在编译时知道行数,您可以使用std::array

std::array<std::vector<std::string>, number_of_rows>

您也可以使用

std::vector<std::string>[number_of_rows]

但使用原始数组并不像std::array那样方便。

如果直到运行时才知道行数,则可以使用向量矢量,如

std::vector<std::vector<std::string>>

答案 1 :(得分:1)

使用C ++时,请避免使用malloc。更喜欢使用new

假设n是编译时常量,您可以使用:

unsigned char (*ary)[n] = new unsigned char[8][n];

如果n是运行时变量,则您很可能需要使用:

unsigned char (*ary)[8] = new unsigned char[n][8];

如果出现以下情况,您可以避免处理动态分配内存的问题:

  1. 您使用std::array作为unsigned char
  2. 的数组
  3. 您使用std::vector来捕获数据的动态特性。
  4. std::struct<std::array<unsigned char, 8>> ary(n);
    

答案 2 :(得分:0)

首先,这个语法比C ++更加C(例如,熟悉new,或者数组/向量/ STL等......)。在你的情况下,如果你真的想要C语法(malloc),那么当你知道在运行时你想要多少malloc时,只需要malloc。你说你不希望所有行都使用相同的n,所以你的行没有逻辑意义(除非是非法的):

char *a[8];
a[0] = malloc(sizeof(char)*the_amount_of_chars_plus_null_termination_in_all_strings);
/* You have to test malloc succeeded! */
/*For each row a different size, which must be known at run time*/

您没有说明如何获取每一行,因此我不知道您是否计划计算这些值,或者从输入中获取字符串,然后您可以为每一行使用strlen+1。< / p>