向量是一维数组在抽象数据类型框架中的推广,也可以说向量是用类来表示的一维数组。在以数组为基础的向量的数据模型上,还要定义一组关于向量的运算,才能使这一数据模型成为一个抽象数据类型。
下面给出一组典型的向量运算。
(1)size():向量的长度
(2)Empty():测试向量是否为空
(3)Capacity():向量的容量
(4)Resize(n):重置向量的容量
(5)=:赋值运算
(6)Front():向量首元素
(7)Back():向量尾元素
(8)Push_back():向量尾插入元素
(9)Pop_back():删除向量尾的元素
(10)Begin():指向向量首的迭代器
(11)End():指向向量尾的下一个位置的迭代器
(12)Print_vector():指向向量尾中的下一个位置的迭代器
在向量的数据模型上,定义了这些运算后,就定义了一个抽象数据类型向量vector。(对于c++中已经封装号的vector的基本是用,请查看之前的博文《标准库vector》)
/* * ===================================================================================== * * Filename: vector.cc * * Description: 向量vector * * Version: 1.0 * Created: 2014年05月19日 11时27分48秒 * Revision: none * Compiler: gcc * * Author: leiyu, leiyujike1107@gmail.com * Company: Class 1107 of Computer Science and Technology * * ===================================================================================== */ #include <iostream> using namespace std; template <class T> class vector { public: typedef T *iterator; typedef const T *const_iterator; vector(int size = 0, const T& value = 0); //构造函数 vector(const vector<T>& obj); //赋值构造函数 vector(const_iterator first, const_iterator last); //构造函数 ~vector() //析够函数 { if (start) delete []start; } vector& operator= (const vector<T>& rhs); //赋值运算 T& front(); //向量首元素 const T& front() const; T& back(); //向量尾元素 const T& back() const; void push_back(const T& item); //向量尾插入一个元素 void pop_back(); //删除向量尾的元素 int size() const { return sz; } void resize(int new_size, const T& x); //重置向量长度 bool empty() const //检测向量是否为空 { return sz == 0; } int capacity() const //向量的容量 { return maxsz; } void print_vector(ostream& out) const; //输出向量 void print_reverse(ostream& out) const; //反向输出向量 iterator begin() //指向向量首的迭代器 { return start; } const_iterator begin() const { return start; } iterator end() //指向向量尾的下一个位置的迭代器 { return sz+start; } const_iterator end() const { return sz+start; } T& operator[](int n) //随机存取运算符 { return *(begin()+n); } const T& operator[] (int n) const { return *(begin()+n); } private: iterator start; //向量内存单元起始地址 int sz; //向量中元素的个数 int maxsz; //分配给向量的可用空间 void reserve(int n, bool copy); //给向量分配内存空间 }; template <class T> void vector<T>::reserve(int n, bool copy) {//给向量分配内存空间 T *tmp = new T[n]; if (tmp == 0) //throw no_mem(); return; for (int i = 0; i < n; i++) tmp[i] = T(); if (sz>n) sz = n; //当copy为true时,进行复制 if (copy) { for (int i = 0; i < sz; i++) tmp[i] = start[i]; } if (start) delete []start; start = tmp; maxsz = n; } template <class T> vector<T>::vector(int size, const T& value):sz(0), maxsz(0), start(0) {//构造函数 if (size == 0) return; reserve(size, false); //申请内存空间 sz = size; for (int i = 0; i < sz; i++) start[i] = value; } template <class T> vector<T>::vector(const vector<T>& obj):sz(0), maxsz(0), start(0) {//复制构造函数 if (obj.sz == 0) return; reserve(obj.sz, false); sz = obj.sz; for (int i = 0; i < sz; i++) start[i] = obj.start[i]; } template <class T> vector<T>::vector(const_iterator first, const_iterator last):maxsz(0), start(0) {//构造函数 sz = last - first; reserve(sz, false); for (int i = 0; i < sz; i++) start[i] = first[i]; } template <class T> void vector<T>::resize(int new_size, const T& x) {//重置向量长度 reserve(new_size, true); //重新申请内存空间 for (int i = 0; i < new_size; i++) //值初始化 start[i] = x; sz = new_size; //新向量长度 } template <class T> vector<T>& vector<T>::operator=(const vector<T>& rhs) {//赋值运算 if (maxsz < rhs.sz) reserve(rhs.sz, false); //申请内存空间 sz = rhs.sz; //向量长度 for (int i = 0; i < sz; i++) start[i] = rhs.start[i]; //赋值 return *this; } template <class T> T& vector<T>::front() {//向量首元素 if (sz == 0) // throw out_bounds(); return; return start[0]; } template <class T> const T& vector<T>::front() const {//向量首元素 if (sz == 0) //throw out_bounds(); return; return start[0]; } template <class T> T& vector<T>::back() {//向量尾元素 if (sz == 0) // throw out_bounds(); return; return start[sz-1]; } template <class T> const T& vector<T>::back() const {//向量尾元素 if (sz == 0) //throw out_bounds(); return; return start[sz-1]; } template <class T> void vector<T>::push_back(const T& item) {//向量尾插入元素 if(sz == maxsz) //已经达到最大容量 { if (maxsz == 0) reserve(1, false); else reserve(2*maxsz, true); //向量容量扩大一倍 } start[sz] = item; sz++; } template <class T> void vector<T>::pop_back() {//删除向量尾与元素 if (sz == 0) // throw out_bonuds(); return; sz--; } template <class T> void vector<T>::print_vector(ostream& out) const {//向量元素送到输出流out中 const_iterator pointer; for (pointer = begin(); pointer != end(); pointer++) out << *pointer << " "; } template <class T> void vector<T>::print_reverse(ostream& out) const {//向量元素反向输出到out中 const_iterator pointer; for (pointer = end(); pointer >= begin(); pointer--) out << *pointer << " "; out << endl; } //重载<<输出运算符 template <class T> ostream& operator<<(ostream& out, const vector<T>& x) { x.print_vector(out); return out; }