我正在尝试将二叉树实现为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 << "*" << " ";
}
}
答案 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]);
对我有用