你好,游客 登录 注册 搜索
背景:
阅读新闻

C++实现动态数组

[日期:2017-06-25] 来源:Linux社区  作者:jiy-for-you [字体: ]

回顾大二的数据结构知识。从数组开始。实现了一个可自动扩充容量的泛型数组。

头文件:Array.h

#ifndef Array_hpp
#define Array_hpp

template <class T>
class Array{
private:
    T *base;        //数组首地址
    int length;     //数组中元素
    int size;       //数组大小,以数组中元素的大小为单位
public:
    //初始化数组,分配内存
    bool init();
    //检查内存是否够用,不够用就增加
    bool ensureCapcity();
    //添加元素到数组尾
    bool add(T item);
    //插入元素到数组的具体位置,位置从1开始
    bool insert(int index,T item);
    //删除指定位置的元素并返回,位置从1开始
    T del(int index);
    //返回指定位置的元素
    T objectAt(int index);
    //打印数组所有元素
    void display();
};

#endif /* Array_hpp */

实现:Array.cpp

#include "Array.hpp"
#include <mm_malloc.h>
#include <iostream>
using namespace std;

template<typename T> bool Array<T>::init(){    
    base = (T *)malloc(10*sizeof(T));
    if(!base){
        return false;
    }
    size = 10;
    length = 0;
    return true;
}

template<typename T> bool Array<T>::ensureCapcity(){
    if(length >= size){
        T *newBase = (T*)realloc(base,10 * sizeof(T) + size);
        if(!newBase){
            return false;
        }
        base = newBase;
        size += 10;
        newBase = nullptr;
    }
    return true;
}

template<typename T> bool Array<T>::add(T item){
    if(!ensureCapcity()){
        return false;
    }
    T *p = base + length;
    *p = item;
    length ++;
    return true;
}

template<typename T> bool Array<T>::insert(int index,const T item){
    if(!ensureCapcity()){
        return false;
    }
    if(index < 1 || index > length){
        return false;
    }
    T *q = base + index - 1;
    T *p = base + length - 1;
    while( p >= q){
        *(p+1) = *p;
        p--;
    }
    *q = item;
    q = nullptr;
    p = nullptr;
    length ++;
    return true;
}

template<typename T>T Array<T>::del(int index){
    if(index<1 || index > length){
        return NULL;
    }
    T *q = base + index - 1;
    T item = *q;
    ++q;
    T *p = base + length;
    while(q <= p){
        *(q-1)=*q;
        ++q;
    }
    length --;
    return item;
}

template<typename T>T Array<T>::objectAt(int index){
    if(index<1 || index > length){
        return NULL;
    }
    T *q = base;
    return *(q + index - 1);
}

template <typename T>void Array<T>::display(){
    T *q = base;
    T *p = base +length - 1;
    while (q<=p) {
        cout << *(q++)<<" ";
    }
    cout << endl;
}

使用:

#include <iostream>
#include "Array.cpp"
using namespace std;

int main(int argc, const char * argv[]) {
    Array<int> array = *new Array<int>;
    array.init();
    array.add(1);
    array.insert(1,2);
    array.objectAt(1);
    return 0;
}

本文永久更新链接地址http://www.linuxidc.com/Linux/2017-06/145180.htm

linux
相关资讯       动态数组 
本文评论   查看全部评论 (0)
表情: 表情 姓名: 字数

       

评论声明
  • 尊重网上道德,遵守中华人民共和国的各项有关法律法规
  • 承担一切因您的行为而直接或间接导致的民事或刑事法律责任
  • 本站管理人员有权保留或删除其管辖留言中的任意内容
  • 本站有权在网站内转载或引用您的评论
  • 参与本评论即表明您已经阅读并接受上述条款