C++数据结构--01数组二次封装成动态数组 2021-04-23

简介: C++数据结构--01数组二次封装成动态数组 2021-04-23
//C++数据结构--01数组二次封装成动态数组
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <string>
#include <sstream>
using namespace std;
template<typename T>
class Array
{
private:
  T* data;
  int capacity;
  int size;
public:
  //无参构造函数,采用模板设置 
  Array():Array(5){}
  //构造函数,传入数组的容量 capacity 构造 Array
  Array(int capacity){
    data=new T[capacity];size=0;this->capacity=capacity;
  }
  //获取数组中的元素个数
  int getsize() { return size; } 
  //获取数组容量
  int getCapacity() { return capacity; }
  //返回数组是否为空
   bool isEmpty() { return size==0; } 
   //向所有元素后添加一个新元素
   void addLast(T e){
    add(size,e);
   }
   //在所有元素前添加一个新元素
   void addFirst(T e){
    add(0,e);
   }
   //在第indx个位置上插入一个新元素e
   void add(int index,T e) {
    if(size == capacity) resize(2*capacity);//扩容 
    if(index<0 || index>size)
      throw "Add failed.Require index>=0 and index<=size.";
    for(int i=size-1;i>=index;i--)
      *(data+i+1) = *(data+i); 
    *(data+index)=e;
    size++;
   }
   //获取index索引位置的元素
   T get(int index){
    if(index<0 || index>=size)
      throw "Add failed. Index is illegal.";
    return *(data+index);
   }
   //修改index索引位置的元素
   void set(int index,T e){
    if(index<0 || index>=size)
      throw "Add failed. Index is illegal.";
    *(data+index)=e;
   } 
   //查找数组中是否有元素e
   bool contains(T e){
    for(int i=0;i<size;i++)
      if(*(data+i)==e) return true;
    return false;
   } 
   //查找数组元素第一个e所在的索引,如果不存在e,则返回-1 
   int find(int e){
    for(int i=0;i<size;i++)
      if(*(data+i)==e) return i;
    return -1;
   }
   //从数组中删除index位置的元素,返回删除的元素
   T remove(int index){
    if(index<0 || index>=size)
      throw "Add failed. Index is illegal.";
    T ret=*(data+index);
    for(int i=index+1;i<size;i++)
      *(data+i-1)=*(data+i);
    size--;
    if(size==capacity/4 && capacity/2!=0) resize(capacity/2);//缩容 
    return ret;
   }
   //从数组中删除第一个元素,返回删除的元素
   T removeFirst() { remove(0); } 
   //从数组中删除最后一个元素,返回删除的元素
   T removeLast() { remove(size-1); } 
   //从数组中删除第一个元素e, 没找到返回false 
   bool removeElement(T e){
    int index=find(e);
    if(index) { return remove(index);}
    else return false;
   }
   //重载[] 
     T& operator [](int index) { return data[index]; }  
   //输出所有数组元素 
   void print(){
    for(int i=0;i<size;i++)
      if(i==0)cout<<"{"<<*(data+i)<<",";
      else if(i==size-1)cout<<*(data+i)<<"}"<<endl;
      else cout<<*(data+i)<<",";
   }
private:
  //动态调整数组大小
  void resize(int newCapacity){ 
    T* newData = new T[newCapacity];
    for(int i=0;i<size;i++)
      *(newData+i)=*(data+i);
    data=newData;
    capacity=newCapacity;
  }
};
class Student{
private:
  string name;
  int score;
public:
  Student(string name,int score){
    this->name=name;
    this->score=score;
  }
  Student(){}
public:
  void print(){
    printf("Student(name:%s ,score: %d)\n",name.c_str(),score);
  }
  //友元函数重载<< 
  friend ostream& operator <<(ostream &os,const Student &s);
};
//重载<<
ostream& operator <<(ostream &os,const Student &s)
{
  os<<"Student(name:"<<s.name<<" ,score: "<<s.score<<")";
  return os;
} 
//重载 &&
string operator &(const string &s,const int n)
{
  int t=n;
  string ss;
  while(t>0){
    ss.insert(ss.begin(),t%10+'0');
    t/=10;
  }
  return s+ss;
} 
//重载 +
string operator +(const string &s,int n)
{
  stringstream ss;
  ss<<n;
  return s+ss.str();
}
void testArry(){
  Array<int>  aa; 
  for(int i=0;i<10;i++)
    aa.addLast(i);
  aa.print();
  cout<<aa.get(1)<<endl;
  aa.add(5,88);
  aa.set(1,22);
  aa.print();
  cout<<"getsize():"<<aa.getsize()<<endl;
  cout<<"getCapacity():"<<aa.getCapacity()<<endl;
  cout<<aa.contains(5)<<endl;
  cout<<aa.find(8)<<endl;
  aa.print();
  cout<<aa.remove(7)<<endl;
  aa.print();
  cout<<aa.removeFirst()<<" "<<aa.removeLast()<<endl;
  aa.print();
  cout<<aa.removeElement(7)<<endl;
  aa.print();
  cout<<"getsize():"<<aa.getsize()<<endl;
  cout<<"getCapacity():"<<aa.getCapacity()<<endl;
  cout<<"isEmpty():"<<aa.isEmpty()<<endl;
}
int main(int argc, char *argv[])
{
  try { testArry();}
  catch(const char* error){ cout<<error<<endl; }
/*
  Student student("Lucy",85);
  student.print();
  Array<Student> arr;
  arr.addLast(Student("Lily",93));
  arr.addLast(Student("Maik",89));
  arr.addLast(Student("Jac",77));
  for(int i=0;i<arr.getsize();i++)
    cout<<arr[i]<<" ";cout<<endl;
  string ss="AAA";
  cout<<(ss+"123")<<endl;
  cout<<(ss&678910456)<<endl;
  cout<<(ss+678910456)<<endl;
   */
  return 0;
}
相关文章
|
2天前
|
存储 C++
C++程序中的对象数组
C++程序中的对象数组
8 0
|
2天前
|
存储 C++
C++程序数组与指针:深入理解与实践
C++程序数组与指针:深入理解与实践
11 1
|
2天前
|
存储 算法 C++
C++程序一维数组:深入理解与实践
C++程序一维数组:深入理解与实践
11 1
|
2天前
|
C++
C++程序中的类封装性与信息隐蔽
C++程序中的类封装性与信息隐蔽
9 1
|
1天前
|
存储 搜索推荐 程序员
C++ 数组
C++ 数组
9 0
|
1天前
|
存储 数据安全/隐私保护 C++
C++ 数据封装
C++ 数据封装
6 0
|
2天前
|
存储 编译器 程序员
从C语言到C++④(第二章_类和对象_上篇)->类->封装->this指针(下)
从C语言到C++④(第二章_类和对象_上篇)->类->封装->this指针
4 0
|
2天前
|
存储 编译器 C语言
从C语言到C++④(第二章_类和对象_上篇)->类->封装->this指针(中)
从C语言到C++④(第二章_类和对象_上篇)->类->封装->this指针
5 0
|
2天前
|
Java C语言 C++
从C语言到C++④(第二章_类和对象_上篇)->类->封装->this指针(上)
从C语言到C++④(第二章_类和对象_上篇)->类->封装->this指针
5 0
|
2天前
|
存储 算法
数据结构与算法②(复杂度相关OJ)(六道数组OJ题)(下)
数据结构与算法②(复杂度相关OJ)(六道数组OJ题)
6 0