Luis Lee 2021-04-04 00:23 采纳率: 53.8%
浏览 232
已采纳

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 */

这部分代码除了这部分有问题以外,其他遍历代码,数组截取代码都没有问题.

解决方案中不要使用标准容器类或者库方法,最好有一些讲解,代码结构上可能有很多不规范的地方请多多包涵,谢谢.

  • 写回答

3条回答 默认 最新

  • lemon-l 2021-04-04 00:52
    关注

    你可以参考字符串的做法,在末尾元素设一个特殊的值,代表结束,字符串的终止值就是‘\0’,或者用类似于STL,传一个begin迭代器和end迭代器,end-begin就等于容器大小

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥15 八爪鱼爬数据为什么自己停了
  • ¥15 交替优化波束形成和ris反射角使保密速率最大化
  • ¥15 树莓派与pix飞控通信
  • ¥15 自动转发微信群信息到另外一个微信群
  • ¥15 outlook无法配置成功
  • ¥30 这是哪个作者做的宝宝起名网站
  • ¥60 版本过低apk如何修改可以兼容新的安卓系统
  • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏
  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率