c++数组作为参数时,如何在函数里获得数组长度
问题描述:
template <class T>
int getArrayLen(T& array)
//不能获取指针数组的长度
{
return (sizeof(array) / sizeof(array[0]));
}
代码如上图,当执行下列代码:
binode<int>l[6]={a,b,c,d,e,f};
cout<<getArrayLen(l)<<endl;
结果为:
6
Program ended with exit code: 0
当执行下列代码:
binode<int>*t=l;
cout<<getArrayLen(t)<<endl;
输出的结果为:
0
Program ended with exit code: 0
这个错误我感觉是这样,一旦数组的指针的地址被拷贝给了另一个地址,编译器(准确的说是sizeof)就不知道他是一个数组,size
of只会返回这个地址表示的内容的大小.
这个代码知识一小部分,完整的题目是这样的,已知某个二叉树的中序和先序遍历(两个链式存储方式的数组)设计算法,设计算法构建这个二叉树并求出他的层次遍历的序列.
#ifndef Tree_h
#define Tree_h
#include <iostream>
#include<stack>
#include<queue>
#include <list>
namespace MyTest{
using namespace std;
//the link-storage for binarytree
template <class T>class binode {
private:
binode* lchild;
binode* rchild;
T data=NULL;
public:
//conduct function
binode(T d=NULL,binode* l=NULL,binode* r=NULL):data(d),lchild(l),rchild(r)
{
//cout<<"conduct successfully!"<<endl;
}
binode* getleft(){return lchild;}
binode* getright(){return rchild;}
void setleft(binode*l){lchild=l;}
void setright(binode*r){rchild=r;}
void setdata(T d){data=d;}
T getdata(){return data;}
//Preorder function
void preorder(){
//if (data!=NULL)
if(this!=NULL)
{
cout<<data<<endl;
lchild->preorder();
rchild->preorder();
}else{
return;
}
}
//Inorder function
void inorder(){
if(this!=NULL)
{
lchild->inorder();
cout<<data<<endl;
rchild->inorder();
}
}
//Postorder function
void postorder(){
if(this!=NULL)
{
lchild->postorder();
rchild->postorder();
cout<<data<<endl;
}
}
//Levelorder function
void levelorder(){
queue<void*> q;
q.push(this);
while(!q.empty()){
cout<< ((binode*)q.front())->data <<endl;
if(((binode*)q.front())->getleft()!=NULL)
q.push(((binode*)q.front())->getleft());
if(((binode*)q.front())->getright()!=NULL)
q.push(((binode*)q.front())->getright());
q.pop() ;
}
}
bool operator==(binode p){
if(this->data==p.getdata()&&this->lchild==p.getleft()&&this->rchild==p.getright()){
return true;
}else{
return false;
}
}
};
template <class T>
int getArrayLen(T& array)
//不能获取指针数组的长度
{
return (sizeof(array) / sizeof(array[0]));
}
//截取数组
template <typename i>
i* concat(i* p,int pri,int be){
i* q=new i[be-pri+1];
int k=0;
int j=pri;
for(;j<=be;j++){
q[k]=p[j];
k++;
}
return q;
}
template <typename H>
binode<H>* CreateBinTree(binode<H> pre[],binode<H> ino[]){
if(getArrayLen(ino)==1){
return ino;
}
for(int i=0;i<getArrayLen(pre);i++){//在先序序列中获取一个根
for(int j=0;getArrayLen(ino);j++){//在中序中找到这个根的位置,他右边是他的左子树序列,左边是右子树序列
if((ino[j]==pre[i])){
ino[j].setleft(CreateBinTree(concat(pre,i+1,getArrayLen(pre)-1),concat(ino,i,j-1)));//对左子序列递归执行
ino[j].setright(CreateBinTree(concat(pre,i+1, getArrayLen(pre)-1),concat(ino,j-1,getArrayLen(ino)-1)));//对右子序列递归执行
break;
}
}
}
}
}
#endif /* Tree_h */
这部分代码除了这部分有问题以外,其他遍历代码,数组截取代码都没有问题.
解决方案中不要使用标准容器类或者库方法,最好有一些讲解,代码结构上可能有很多不规范的地方请多多包涵,谢谢.
答
你可以参考字符串的做法,在末尾元素设一个特殊的值,代表结束,字符串的终止值就是‘\0’,或者用类似于STL,传一个begin迭代器和end迭代器,end-begin就等于容器大小
答
在网上查了好久也没有解决办法,实在不行用链表解决一下也可以(能不用尽量不用).
答
您好,我是有问必答小助手,你的问题已经有小伙伴为您解答了问题,您看下是否解决了您的问题,可以追评进行沟通哦~
如果有您比较满意的答案 / 帮您提供解决思路的答案,可以点击【采纳】按钮,给回答的小伙伴一些鼓励哦~~
ps:问答VIP仅需29元,即可享受5次/月 有问必答服务,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632