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;
}
相关文章
|
1月前
|
存储 Java 程序员
数据结构之 - 深入了解数组数据结构
数据结构之 - 深入了解数组数据结构
38 6
|
2月前
|
搜索推荐 编译器 C语言
【C++核心】特殊的元素集合-数组与字符串详解
这篇文章详细讲解了C++中数组和字符串的基本概念、操作和应用,包括一维数组、二维数组的定义和使用,以及C风格字符串和C++字符串类的对比。
78 4
|
3月前
|
安全 编译器 C语言
【C++数据结构】string的模拟实现
【C++数据结构】string的模拟实现
|
1月前
|
存储 算法 搜索推荐
探索常见数据结构:数组、链表、栈、队列、树和图
探索常见数据结构:数组、链表、栈、队列、树和图
99 64
|
1月前
|
算法 程序员 索引
数据结构与算法学习七:栈、数组模拟栈、单链表模拟栈、栈应用实例 实现 综合计算器
栈的基本概念、应用场景以及如何使用数组和单链表模拟栈,并展示了如何利用栈和中缀表达式实现一个综合计算器。
30 1
数据结构与算法学习七:栈、数组模拟栈、单链表模拟栈、栈应用实例 实现 综合计算器
|
1月前
|
存储 算法 定位技术
数据结构与算法学习二、稀疏数组与队列,数组模拟队列,模拟环形队列
这篇文章主要介绍了稀疏数组和队列的概念、应用实例以及如何使用数组模拟队列和环形队列的实现方法。
20 0
数据结构与算法学习二、稀疏数组与队列,数组模拟队列,模拟环形队列
|
1月前
|
NoSQL Redis C++
Redis的实现五:二叉堆的数据结构和TTL、c,c++的实现
这篇文章详细探讨了二叉堆的数据结构及其在C和C++中的实现,特别强调了二叉堆在Redis中实现TTL(生存时间)功能的重要性,并通过代码示例展示了如何在Redis中使用二叉堆来管理键的过期时间。
41 0
|
2月前
|
C++
C++(十一)对象数组
本文介绍了C++中对象数组的使用方法及其注意事项。通过示例展示了如何定义和初始化对象数组,并解释了栈对象数组与堆对象数组在初始化时的区别。重点强调了构造器设计时应考虑无参构造器的重要性,以及在需要进一步初始化的情况下采用二段式初始化策略的应用场景。
|
2月前
|
数据安全/隐私保护 C语言 C++
C++(七)封装
本文档详细介绍了C++封装的概念及其应用。封装通过权限控制对外提供接口并隐藏内部数据,增强代码的安全性和可维护性。文档首先解释了`class`中的权限修饰符(`public`、`private`、`protected`)的作用,并通过示例展示了如何使用封装实现栈结构。接着介绍了构造器和析构器的使用方法,包括初始化列表的引入以及它们在内存管理和对象生命周期中的重要性。最后,通过分文件编程的方式展示了如何将类定义和实现分离,提高代码的模块化和复用性。
|
2月前
|
存储 Java
java数据结构,线性表顺序存储(数组)的实现
文章介绍了Java中线性表顺序存储(数组)的实现。线性表是数据结构的一种,它使用数组来实现。文章详细描述了线性表的基本操作,如增加、查找、删除、修改元素,以及其他操作如遍历、清空、求长度等。同时,提供了完整的Java代码实现,包括MyList接口和MyLinearList实现类。通过main函数的测试代码,展示了如何使用这些方法操作线性表。

热门文章

最新文章