template<typename T> bool Array<T>::add(const int index, const T& e) { if (index<0 || index>size)return false; //判斷索引是否正確 if (size == capacity)resize(1.5 * capacity); //判斷空間是否足夠,不夠擴容爲當前的2倍 for (int i = size - 1; i >= index; --i) //從後向前循環 { data[i + 1] = data[i]; //所有元素向後移一位 } data[index] = e; //插入元素 ++size; //數組元素的個數+1 return true; }
template<typename T> void Array<T>::resize(const int newcapacity) { T* newdata = new T[newcapacity]; //建立新的傳入大小數組空間 for (int i = 0; i < size; ++i) //把本來的數組元素放入新的數組空間 { newdata[i] = data[i]; } data = newdata; //把本來的數組指向新的數組 capacity = newcapacity; //新的空間大小給本來的空間大小 newdata = nullptr; //把新數組置爲空 delete[] newdata; //釋放新數組 }
template<typename T> T Array<T>::remove(const int index) { if (index<0 || index>size)return -1; //判斷索引是否正確 T ret = data[index]; //保存臨時元素 for (int i = index + 1; i < size; ++i) { data[i - 1] = data[i]; //從要插入的元素後一位全部元素向前移一位 } --size; //元素個數-1 if (size == capacity / 4 && capacity / 2 != 0) //判斷元素個數是否爲數組容量的1/4而且數組空間不爲0 { resize(capacity / 2); //調用resize傳入當前容量的一半 } return ret; //返回被刪除的元素 }
9次addLast操做,觸發resize,總共進行了17次基本操做,平均每次addLast操做,進行2次基本操做。ios
假設capacity = n,n+1次addLast,觸發resize,總共進行2n+1次基本操做,平均每次addLast操做進行2次基本操做。數組
這樣均攤計算時間複雜度是O(1),同理removeLast操做,均攤複雜度也爲O(1)。spa
#pragma once #include<iostream> template<typename T> class Array { public: //無參構造 Array() :size(0), capacity(10) { data = new T[10]; //默認初始化10個空間 } //有參構造 Array(int capacity) :size(0), capacity(capacity) { data = new T[capacity]; } //返回元素個數 int getSize()const; //返回數組容量 int getCapacity()const; //返回第一個元素 T getFirst(); //返回最後一個元素 T getLast(); //判斷是否爲空 bool isEmpty()const; //插入元素 bool add(const int index, const T& e); //頭插 bool addFirst(const T& e); //尾插 bool addLast(const T& e); //查找數組中是否存在該元素 bool contains(const T& e)const; //查找數組中元素的索引,不存在返回-1 int find(const T& e)const; //刪除索引元素,返回刪除元素 T remove(const int index); //刪除頭,返回頭 T removeFirst(); //刪除尾,返回尾 T removeLast(); //設置索引值 bool set(const int index, const T& e); //獲取索引值 T get(const int index)const; //打印元素 void print()const; //釋放空間 ~Array(); private: void resize(const int newcapacity); //從新分配空間 T* data; int size; //數組大小 int capacity; //數組容量 }; template<typename T> int Array<T>::getSize() const { return size; //返回數組長度 } template<typename T> int Array<T>::getCapacity() const { return capacity; //返回數組容量 } template<typename T> inline T Array<T>::getFirst() { return get(0); } template<typename T> inline T Array<T>::getLast() { return get(size - 1); } template<typename T> bool Array<T>::isEmpty() const { return size == 0; //判斷是否爲空, } template<typename T> bool Array<T>::add(const int index, const T& e) { if (index<0 || index>size)return false; //判斷索引是否正確 if (size == capacity)resize(2 * capacity); //判斷空間是否足夠,不夠擴容爲當前的2倍 for (int i = size - 1; i >= index; --i) //從後向前循環 { data[i + 1] = data[i]; //所有元素向後移一位 } data[index] = e; //插入元素 ++size; //數組元素的個數+1 return true; } template<typename T> bool Array<T>::addFirst(const T& e) { return add(0, e); //調用add從0號索引元素插入 } template<typename T> bool Array<T>::addLast(const T& e) { return add(size, e); //調用add從size號索引元素插入 } template<typename T> bool Array<T>::contains(const T& e) const { for (int i = 0; i < size; ++i) //遍歷是否有查找的元素 { if (data[i] == e)return true; } return false; } template<typename T> int Array<T>::find(const T& e) const { for (int i = 0; i < size; ++i) //遍歷是否有查找的元素,有返回索引,無返回-1 { if (data[i] == e)return i; } return -1; } template<typename T> T Array<T>::remove(const int index) { if (index<0 || index>size)return -1; //判斷索引是否正確 T ret = data[index]; //保存臨時元素 for (int i = index + 1; i < size; ++i) { data[i - 1] = data[i]; //從要插入的元素後一位全部元素向前移一位 } --size; //元素個數-1 if (size == capacity / 4 && capacity / 2 != 0) //判斷元素個數是否爲數組容量的1/4而且數組空間不爲0 { resize(capacity / 2); //調用resize傳入當前容量的一半 } return ret; //返回被刪除的元素 } template<typename T> T Array<T>::removeFirst() { return remove(0); //刪除0號索引元素 } template<typename T> T Array<T>::removeLast() { return remove(size - 1); //刪除size-1號索引元素 } template<typename T> bool Array<T>::set(const int index, const T& e) { if (index<0 || index>size)return false; //判斷索引元素是否正確 data[index] = e; //設置索引的新元素 return true; } template<typename T> T Array<T>::get(const int index) const { if (index<0 || index>size)return -1; //判斷索引元素是否正確 return data[index]; //返回索引元素 } template<typename T> void Array<T>::print() const { std::cout << "Array:size = " << size << " Array:capacity = " << capacity << std::endl; std::cout << "Array:data = " << "["; for (int i = 0; i < size; ++i) { std::cout << data[i] << ","; } std::cout << "]" << std::endl; } template<typename T> Array<T>::~Array() { delete[] data; //釋放空間 data = nullptr; } template<typename T> void Array<T>::resize(const int newcapacity) { T* newdata = new T[newcapacity]; //建立新的傳入大小數組空間 for (int i = 0; i < size; ++i) //把本來的數組元素放入新的數組空間 { newdata[i] = data[i]; } data = newdata; //把本來的數組指向新的數組 capacity = newcapacity; //新的空間大小給本來的空間大小 newdata = nullptr; //把新數組置爲空 delete[] newdata; //釋放新數組 }
#include"Array.h" using namespace std; int main() { Array<int>* arr = new Array<int>(10); for (int i = 0; i < 10; ++i) { arr->addLast(i); } arr->print(); cout << endl; cout << "arr->add(1, 1)" << arr->add(1, 1) << endl; arr->print(); cout << endl; cout << "arr->addLast(0) " << arr->addLast(0) << endl; arr->print(); cout << endl; cout << "arr->addFirst(0)" << arr->addFirst(0) << endl; arr->print(); cout << endl; cout << "arr->contains(0)" << arr->contains(0) << endl; arr->print(); cout << endl; cout << "arr->find(0)" << arr->find(0) << endl; arr->print(); cout << endl; cout << "arr->get(1)" << arr->get(1) << endl; arr->print(); cout << endl; cout << "arr->set(0, 5)" << arr->set(0, 5) << endl; arr->print(); cout << endl; cout << "arr->getCapacity()" << arr->getCapacity() << endl; arr->print(); cout << endl; cout << "arr->getSize()" << arr->getSize() << endl; arr->print(); cout << endl; cout << "arr->isEmpty()" << arr->isEmpty() << endl; arr->print(); cout << endl; cout << "arr->remove(1)" << arr->remove(1) << endl; arr->print(); cout << endl; cout << "arr->removeFirst()" << arr->removeFirst() << endl; arr->print(); cout << endl; cout << "arr->removeLast()" << arr->removeLast() << endl; arr->print(); cout << endl; cout << "arr->getFirst" << arr->getFirst() << endl; arr->print(); cout << endl; cout << "arr->getLast" << arr->getLast() << endl; arr->print(); delete arr; return 0; }