首页 > 其他分享 >写个简单的管理数组指针的智能指针

写个简单的管理数组指针的智能指针

时间:2023-10-22 09:01:17浏览次数:38  
标签:写个 return iterator int 数组 const 指针

模板智能数组指针

1.管理任意类型的数组指针

2.释放的时候自动删除数组指针指向的内存

//模板智能数组指针
template<typename T>
class AiArrayPtr
{
public:
     AiArrayPtr(T *pArray)
    {
        m_pAiPtr = pArray;
        m_bIsMyPtr =true;//是自己管理的指针
        m_nSize = GetArraySize(pArray);//计算数组在内存中的个数
    }
  ~AiArrayPtr(){
    if(m_pAiPtr && m_bIsMyPtr)//指针不为空并且是自己管理的指针
    { 
      delete[] m_pAiPtr;
      m_pAiPtr=nullptr;
    }
   }
private:
  T* m_pAiPtr;    //保存数组指针
  bool m_bIsMyPtr;  //是否自己删除数组指针
  int m_nSize;    //数组大小
};

3.通过指针计算数组中的个数

//通过指针获取数组个数
int GetArraySize(const T  *pArray)const
{
    const char* pname = typeid(T).name(); //获得类型名称
    int s = 0;

    //检查是否是结构体sturct 或是类class
    if (strstr(pname, "struct") || strstr(pname, "class"))
    {
        s = *((size_t*)pArray - 1); //获取对象数组个数
    }
    else
    {
        s = _msize(pArray) / sizeof(T); //获取内置数据数组个数
    }
    return s;
}

 

3.要有指针的样式和数组的样式

//重载->运算符
const AiArrayPtr* operator->()const {
     return this; }

//重载[]运算符
T operator[](int index) { 
    if (index < 0 || index >= m_nSize)
    {
        throw(TEXT("数组越界"));
            return T();
    }
    return *(m_pAiPtr + index);
 }

4.支持for范围查询和迭代器

//AiArrayPtr的类中类迭代器
class iterator
{
private:
    T* m_pCur;  //当前指针数据
public:
    iterator(T* pCur)
        :m_pCur(pCur) {}

    T operator*() { //迭代器解引用
        return *m_pCur; 
    }

    iterator& operator++() { //前置++运算符
        m_pCur++; return *this; 
    }

    iterator& operator++(int) { //后置++运算符
        m_pCur++; return *this; 
    }

    bool operator==(iterator const& it)const { //==运算符
        return m_pCur == it.m_pCur; 
    }

    bool operator!=(iterator const &it)const { //!=运算符
        return !(*this == it); 
    }
};

//在AiArrayPtr类实现bigin()和end()函数
iterator begin()const { //范围开始
  return iterator(m_pAiPtr); 
}

iterator end()const { //范围结束
  return iterator(m_pAiPtr + m_nSize); 
}

5.实例用法

AiArrayPtr<int> pint = new int[3]{ 4,5,6 };
int nSize=pint->GetSize();//指针样式用法
int n = pint[2];//数组样式用法 for (const int &v : pint)//支持新的for范围查询 { OutString(TEXT("V= %d"), v); }
//支持以前的for范围查询 for (AiArrayPtr<int>::iterator it = pint->begin();    it != pint->end(); it++) {   OutString(TEXT("V= %d"), *(it)); }

 

标签:写个,return,iterator,int,数组,const,指针
From: https://www.cnblogs.com/greenleaf1976/p/17779885.html

相关文章

  • Arrays.asList()把数组转换成集合时,不能使用其修改集合相关的方法
    Arrays.asList()把数组转换成集合时,不能使用其修改集合相关的方法,此处测试代码如下,这里使用add方法:1publicclassmain{2publicstaticvoidmain(String[]args){3int[]num={1,2,3};4Listlist=Arrays.asList(num);5list.add(4);......
  • c++指针相关
    常量指针(PointertoConstant)定义:一个指向常量的指针。这意味着指针指向的值不能被修改,但指针本身可以被修改,即可以重新指向其他地址。声明:constType*pointerName;constint*p1;intx=10,y=20;p1=&x;//Valid*p1=50;//Errorp1=&y;//Valid指针......
  • 无涯教程-AWK - 数组(Array)
    AWK具有关联数组,您可以使用字符串或数字作为数组索引。array_name[index]=value其中array_name是数组的名称,index是数组的索引,而value是分配给数组元素的任何值。创建数组为了获得更多关于数组的见解,让我们创建和访问数组的元素。[Learnfk]$awk'BEGIN{fruits["m......
  • 26. 删除有序数组中的重复项
    给你一个非严格递增排列的数组nums,请你原地删除重复出现的元素,使每个元素只出现一次,返回删除后数组的新长度。元素的相对顺序应该保持一致。然后返回nums中唯一元素的个数。考虑nums的唯一元素的数量为k,你需要做以下事情确保你的题解可以被通过:更改数组nums......
  • 80. 删除有序数组中的重复项 II
    给你一个有序数组nums,请你原地删除重复出现的元素,使得出现次数超过两次的元素只出现两次,返回删除后数组的新长度。不要使用额外的数组空间,你必须在原地修改输入数组并在使用O(1)额外空间的条件下完成。示例1:输入:nums=[1,1,1,2,2,3]输出:5,nums=[1,1,2,2,3]......
  • 慎用智能指针的reset方法
    背景使用智能指针指向class的成员变量会导致指针Segmentationfault.复现直接看代码https://godbolt.org/z/Tnx45jraP#include<iostream>#include<memory>structHandler{intnum=7;};intmain(){Handlerhandler;std::shared_ptr<int>ptr=null......
  • map遍历数组返回包含所需字段的对象
    假如dataList为后台假数据,我想分别得到number和chargeTime、number和freeTime,来分别画图,就可以这么写,当然直接for循环更可以。1constdataList={2list:[3{4number:"0",5chargeTime:2,6freeTime:57......
  • 运用模板重载二维数组
    #include<iostream>#include<array>usingnamespacestd;//stack.htemplate<typenameT>classArray{public: Array(introw,intcol); T*operator[](introw);public: T*m_pT; intm_Row; intm_Col;};template<typenameT>Ar......
  • javascript: 合并数组
     <!doctypehtml><html><head><metacharset="utf-8"><metaname="viewport"content="width=device-width,initial-scale=1.0,maximum-scale=1.0,minimum-scale=1.0,user-scalable=no"><metahttp-eq......
  • javascript 数组对象根据id去重的几种方法
    例如:想去除重复id为1的项arr=[{id:1,name:'张三',age:20},{id:1,name:'张三',age:20},{id:2,name:'李四',age:20},{id:3,name:'马五',age:20},];方法一通过forEach再通过some方法判断数组是否包含当前对象id,不包含则添加so......