如何在C ++中将字符串的动态二维数组作为参数传递

时间:2019-03-19 23:28:52

标签: c++ arrays multidimensional-array parameters

我正在尝试将二叉树实现为2d数组。我希望用户输入所需的树高,程序应提供适当的大小数组。然后,我想打印该数组,这就是为什么我需要将其作为参数传递的原因。但是,出现以下错误:

  

arrayTree / main.cpp | 19 |错误:无法转换'std :: __ cxx11 :: string **(*)[maxNumberOfNodes] {aka std :: __ cxx11 :: basic_string **(*)[maxNumberOfNodes ]}'设为'std :: __ cxx11 :: string ** {aka std :: __ cxx11 :: basic_string **}',参数'1'为'void printTree(std :: __ cxx11 :: string *)' |

请问,是什么引起了错误,我该如何解决?

#include <iostream>
#include <string>
#include <math.h>

using namespace std;
void printTree(string** tree);
int main()
{
    int treeHeight = 0;
    int maxNumberOfNodes = 1;
    cout << "enter tree height";
    cin >> treeHeight;
    cout << treeHeight<< "\n";

    //create an array that can hold every combination for a given tree height
    maxNumberOfNodes = pow(2,treeHeight) - 1;
    string** tree [3][maxNumberOfNodes];
    cout << maxNumberOfNodes;
    printTree(tree);

}

 void printTree(string** tree){
//not fully implemented yet
    for(int i=0; i < sizeof(tree);  i++){
        cout << "*" << " ";
    }
}

3 个答案:

答案 0 :(得分:3)

string** tree [3][maxNumberOfNodes];

是string **类型的静态2D数组的语法,其中两个维度都必须声明为const。

静态数组和动态数组之间的区别如下所示:Multidimensional variable size array in C++

相反,您想要编写类似的内容

string** tree = new string*[3];
for(int i = 0; i < 3; i++)
   tree[i] = new string[maxNumberOfNodes];

正如@Remy Lebeau所说:每次new[]的出现都需要通过delete[]呼叫来回答,就像这样:

for (int i = 0; i < 3; i++)
    delete tree[i];
delete[] tree;

从堆中删除动态分配。

就像@drescherjm一样,sizeof(tree)无效,因为tree只是一个指针,不包含有关数组的大小信息。

您可以通过另外传递数组的尺寸来解决此问题:

void printTree (string** tree, int dim, int dim2)

并将循环重写为

for(int i = 0; i < dim; i++){
  for(int j = 0; j < dim2; j++){
    cout << tree[i][j]; //...
  }
}

答案 1 :(得分:1)

string** tree [3][maxNumberOfNodes];

这将声明string**指针的2D数组。那不是你想要的。您需要一个string对象的2D数组,所以删除指针:

string tree [3][maxNumberOfNodes];

此外,您的printTree()实施不正确。它将需要更像这样实现:

void printTree(string** tree, int height) {
    for(int i = 0; i < 3;  i++) {
        for(int j = 0; j < height; j++) {
            // use tree[i][j] as needed ...
        }
    }
}

话虽这么说,由于maxNumberOfNodes的值直到运行时才知道,因此string tree [3][maxNumberOfNodes]语法声明了一个可变长度数组,但是C ++标准,仅作为一些C ++编译器的扩展。您需要使用new[]来分配第二维:

string* tree [3];
for(int i = 0; i < 3; ++i)
    tree[i] = new string[maxNumberOfNodes];

printTree(tree, maxNumberOfNodes);

for(int i = 0; i < 3; ++i)
    delete[] tree[i];

或者更好,使用std::vector代替:

std::vector<string> tree [3];
for(int i = 0; i < 3; ++i)
    tree[i].resize(maxNumberOfNodes);

但是,在后一种情况下,您将无法将tree传递给string**函数参数,因此必须相应地调整代码。

答案 2 :(得分:-1)

方法调用由

给出

printTree(tree [3][maxNumberOfNodes]);

对我有用