bobo839485892
Luis Lee
2021-04-04 00:23
采纳率: 25%
浏览 67

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条回答 默认 最新

  • dan452819043
    lemon-l 2021-04-04 00:52
    已采纳

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

    点赞 1 评论
  • bobo839485892
    Luis Lee 2021-04-04 00:31

    在网上查了好久也没有解决办法,实在不行用链表解决一下也可以(能不用尽量不用).

    点赞 评论
  • QA_Assistant
    有问必答小助手 2021-04-04 22:28

    您好,我是有问必答小助手,你的问题已经有小伙伴为您解答了问题,您看下是否解决了您的问题,可以追评进行沟通哦~

    如果有您比较满意的答案 / 帮您提供解决思路的答案,可以点击【采纳】按钮,给回答的小伙伴一些鼓励哦~~

    ps:问答VIP仅需29元,即可享受5次/月 有问必答服务,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632

    点赞 评论

相关推荐