现在的位置: 首页 > 综合 > 正文

[STL学习] C++编程实现 (vector)

2019年05月17日 ⁄ 综合 ⁄ 共 4139字 ⁄ 字号 评论关闭

        向量是一维数组在抽象数据类型框架中的推广,也可以说向量是用类来表示的一维数组。在以数组为基础的向量的数据模型上,还要定义一组关于向量的运算,才能使这一数据模型成为一个抽象数据类型。
下面给出一组典型的向量运算。
(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;
}

抱歉!评论已关闭.