zoukankan      html  css  js  c++  java
  • 线性表Vector

    线性表 Vector

    #ifndef SJTU_VECTOR_HPP
    #define SJTU_VECTOR_HPP
    
    #include <cstddef>
    #include <cstring>
    #include <string>
    #include <cstdlib>
    #include <vector>
    #include <climits>
    #include <cstddef>
    namespace sjtu {
    class exception 
    {
    protected:
    		const std::string variant = "";
    		std::string detail = "";
    public:
    		exception() {}
    		exception(const exception &ec) : variant(ec.variant), detail(ec.detail) {}
    		virtual std::string what() {
    			return variant + " " + detail;
    		}
    };
    class index_out_of_bound : public exception {};
    class runtime_error : public exception {};
    class invalid_iterator : public exception {};
    class container_is_empty : public exception {};
    
    template<typename T>
    class vector {
    private:
    	T* data;
    	size_t currentsize;
    	size_t maxsize;
    	void delete00()
        {
    		for (size_t i = 0; i != maxsize; ++i)
    		{
    			data[i].~T();
    		}
            free(data);
        }
    public:
    	class const_iterator;
    	class iterator;
    	void doublespace();
    	vector(int inputsize = 10);
    	vector(const vector<T> &other);
    	vector(const std::vector<T> &other);
    	~vector() {delete00();}
    	vector<T>& operator=(const vector<T> &other);
    	T & at(const size_t &pos);
    	const T & at(const size_t &pos) const;
    	T & operator[](const size_t &pos);
    	const T & operator[](const size_t &pos) const;
    	const T & front() const;
    	const T & back() const;
    	bool empty() const;
    	size_t size() const;
    	size_t capacity() const;
    	void clear();
    	void push_back(const T &value);
    	void pop_back();
    	iterator begin() 
    	{
    	 return iterator(this,0);
    	}
    	const_iterator cbegin() const {
    	 return const_iterator(this,0);
    	}
    	iterator end() 
    	{
    		return iterator(this,currentsize);
    	}
    	const_iterator cend() const 
    	{
    		return const_iterator(this,currentsize);
    	}
    	iterator insert(iterator it, const T &value) 
    	{
    		if(currentsize>=maxsize)
    		{
    			doublespace();
    		}
    		size_t inipos = it.thepos();
    		iterator right=iterator(this,currentsize);
    		while(right.thepos()>it.thepos())
    		{
    			*right=*(right-1);
    			right --;
    		}
    		data[inipos] = value;
    		currentsize ++;
    		return it;
    	}
    	iterator insert(const size_t &ind, const T &value) 
    	{
    		if(currentsize>=maxsize)
    		{
    			doublespace();
    		}
    		if(ind>currentsize)
    		{
    			throw index_out_of_bound();
    		}
    		size_t right = currentsize;
    		while(right>ind)
    		{
    			data[right]=data[right-1];
    			right--;
    		}
    		data[right-1]=value;
    		iterator tmp=iterator(this,right-1);
    		currentsize ++;
    		return tmp;
    	}
    	iterator erase(iterator it) 
    	{
    		size_t tmp = it.thepos();
    		size_t theend = currentsize-1;
    		while(tmp<theend)
    		{
    			data[tmp]=data[tmp+1];
    			tmp++;
    		}
    		currentsize--;
    		return iterator(this,it.thepos());
    	}
    	iterator erase(const size_t &ind) 
    	{
    		size_t k = ind;
    		while(k<currentsize-1)
    		{
    			data[k]=data[k+1];
    		}
    		currentsize--;
    		return iterator(this,ind);
    	}
    };
    template <typename T>
    class vector<T>::const_iterator
    {
    private:
    		vector* vec;
    		size_t pos;
    public:
    		vector* thevec()
    		{
    			return vec;
    		}
    		size_t thepos()
    		{
    			return pos;
    		}
    		const_iterator(vector* inputvec, size_t inputpos)
    		{
    			vec = inputvec;
    			pos = inputpos;
    		}
    		const_iterator(const vector* ptrvec, size_t ptrpos) : vec(const_cast<vector *>(ptrvec)), pos(ptrpos) {}
    		const_iterator operator+(const int &n) const 
    		{
    			return const_iterator(vec, pos + n);
    		}
    		const_iterator operator-(const int &n) const 
    		{
    			pos -= n;
    			return *this;
    		}
    		int operator-(const iterator &rhs) const 
    		{
    			if (vec != rhs.vec)
    			{
    				throw invaild_iterator();
    			}
    			return rhs.pos - pos;
    		}
    		const_iterator operator+=(const int &n) 
    		{
    			pos += n;
    			return *this;
    		}
    		const_iterator operator-=(const int &n) 
    		{
    			pos -= n;
    			return *this;
    		}
    		const_iterator operator++(int)
    		{
    			size_t ii = pos;
    			++pos;
    			return const_iterator(vec, ii);
    		}
    		const_iterator& operator++() 
    		{
    			pos++;
    			return *this;
    		}
    		const_iterator operator--(int) 
    		{
    			const_iterator it(vec, pos);
    			pos--;
    			return it;;
    		}
    		const_iterator& operator--() 
    		{
    			pos--;
    			return *this;
    		}
    		const T& operator*() const 
    		{
    			return vec->data[pos];
    		}
    		bool operator==(const iterator &rhs) const 
    		{
    			return rhs.vec == vec&&rhs.pos == pos;
    		}
    		bool operator==(const const_iterator &rhs) const 
    		{
    			return rhs.vec == vec&&rhs.pos == pos;
    		}
    		bool operator!=(const iterator &rhs) const 
    		{
    			return !(*this == rhs);
    		}
    		bool operator!=(const const_iterator &rhs) const 
    		{
    			return !(*this == rhs);
    		}
    };
    template <typename T>
    class vector<T>::iterator
    {
    	private:
    		vector* vec;
    		size_t pos;
    
    	public:
    		vector* thevec()
    		{
    			return vec;
    		}
    		size_t thepos()
    		{
    			return pos;
    		}
    		iterator(vector* inputvec, size_t inputpos)
    		{
    			vec = inputvec;
    			pos = inputpos;
    		}
    		iterator operator+(const int &n) const 
    		{
    			return iterator(vec, pos + n);
    		}
    		iterator operator-(const int &n) const 
    		{
    			return iterator(vec, pos - n);
    		}
    
    		int operator-(const iterator &rhs) const 
    		{
    			if (vec != rhs.vec)
    			{
    				throw invaild_iterator();
    			}
    			return rhs.pos - pos;
    		}
    		iterator operator+=(const int &n) 
    		{
    			pos += n;
    			return *this;
    		}
    		iterator operator-=(const int &n) 
    		{
    			pos -= n;
    			return *this;
    		}
    		iterator operator++(int) 
    		{
    			iterator it = iterator(vec, pos);
    			pos++;
    			return it;
    		}
    
    		iterator& operator++() 
    		{
    			pos++;
    			return *this;
    		}
    		iterator operator--(int) 
    		{
    			iterator it(vec, pos);
    			pos--;
    			return it;
    		}
    		iterator& operator--() 
    		{
    			pos--;
    			return *this;
    		}
    		T& operator*() const 
    		{
    			return vec->data[pos];
    		}
    		bool operator==(const iterator &rhs)
    		{
    			return (vec == rhs.vec && pos == rhs.pos);
    		}
    		bool operator==(const const_iterator &rhs)
    		{
    			return (vec == rhs.vec && pos == rhs.pos);
    		}
    		bool operator!=(const iterator &rhs) const 
    		{
    			return !(vec == rhs.vec && pos == rhs.pos);
    		}
    		bool operator!=(const const_iterator &rhs) const 
    		{
    			return !(vec == rhs.vec && pos == rhs.pos);
    		}
    };
    template <class T>
    void vector<T>::doublespace()
    {
    	T*p = (T*)malloc(maxsize * 2 * sizeof(T));
    	memset(p, 0, maxsize * 2 * sizeof(T));
    	for (int i = 0; i < currentsize; i++)
    	{
    		p[i] = data[i];
    	}
    
    	delete00();
    	data = p;
    	maxsize *= 2;
    }
    template<class T>
    vector<T>::vector(int inputsize = 10) 
    {
    	currentsize = 0;
    	maxsize = inputsize;
    	data = (T *)malloc(maxsize * sizeof(T));
    	memset(data, 0, maxsize * sizeof(T));
    }
    template <class T>
    vector<T>::vector(const vector<T> &other)
    {
    	currentsize = other.currentsize;
    	maxsize = other.maxsize;
    	data = (T *)malloc(maxsize * sizeof(T));
    	memset(data, 0, maxsize * sizeof(T));
    	for (size_t i = 0; i < other.currentsize; i++)
    	{
    		data[i] = other[i];
    	}
    
    }
    template <class T>
    vector<T>::vector(const std::vector<T> &other)
    {
    	currentsize = other.size();
    	maxsize = other.size();
    	data = (T *)malloc(maxsize * sizeof(T));
    	memset(data, 0, maxsize * sizeof(T));
    	for (size_t i = 0; i < other.size(); i++)
    	{
    		data[i] = other[i];
    	}
    
    }
    template <class T>
    vector<T>& vector<T>::operator=(const vector<T> &other) 
    {
    	if (&other == this) return*this;
    	T*p = (T*)malloc(maxsize * sizeof(T));
    	memset(p, 0, maxsize * sizeof(T));
    	for (int i = 0; i < other.currentsize; i++)
    	{
    		p[i] = other.data[i];
    	}
    	delete00();
    	currentsize = other.currentsize;
    	maxsize = other.maxsize;
    	data = p;
    	return *this;
    }
    template <class T>
    T & vector<T>::at(const size_t &pos) 
    {
    	if (!(pos >= 0 && pos<currentsize))
    	{
    		throw index_out_of_bound();
    	}
    	else
    	{
    		return data[pos];
    	}
    }
    template <class T>
    const T & vector<T>::at(const size_t &pos) const 
    {
    
    	if (!(pos >= 0 && pos<currentsize))
    	{
    		throw index_out_of_bound();
    	}
    	else
    	{
    		return data[pos];
    	}
    }
    template <class T>
    T & vector<T>::operator[](const size_t &pos) 
    {
    	if (!(pos >= 0 && pos<currentsize))
    	{
    		throw index_out_of_bound();
    	}
    	else
    	{
    		return data[pos];
    	}
    }
    template <class T>
    const T & vector<T>::operator[](const size_t &pos) const 
    {
    	if (!(pos >= 0 && pos<currentsize))
    	{
    		throw index_out_of_bound();
    	}
    	else
    	{
    		return data[pos];
    	}
    }
    template <class T>
    const T & vector<T>::front() const 
    {
    	if (!currentsize)
    	{
    		throw container_is_empty();
    	}
    	else
    	{
    		return data[0];
    	}
    }
    template <class T>
    const T & vector<T>::back() const 
    {
    	if (!currentsize)
    	{
    		throw container_is_empty();
    	}
    	else
    	{
    		return data[currentsize - 1];
    	}
    }
    template <class T>
    bool vector<T>::empty() const
    {
    	return currentsize == 0;
    }
    template <class T>
    size_t vector<T>::size() const
    {
    	return currentsize;
    }
    template <class T>
    size_t vector<T>::capacity() const
    {
    	return maxsize;
    }
    template <class T>
    void vector<T>::clear()
    {
    	currentsize = 0;
    }
    template <class T>
    void vector<T>::push_back(const T &value)
    {
    	if (currentsize == maxsize)
    	{
    		doublespace();
    	}
    	data[currentsize++] = value;
    }
    template <class T>
    void vector<T>::pop_back()
    {
    	currentsize--;
    }
    }
    #endif
    

      

  • 相关阅读:
    2017.4.7 java异常处理总结
    2017.3.31 spring mvc教程(八) <mvc:annotation-driven />所做的工作
    2017.3.31 spring mvc教程(七)多视图控制器
    2017.3.31 spring mvc教程(六)转发、重定向、ajax请求
    2017.3.31 spring mvc教程(五)Action的单元测试
    2017.3.31 spring mvc教程(四)全局的异常处理
    2017.3.31 spring mvc教程(三)拦截器
    2017.3.31 spring mvc教程(二)核心流程及配置详解
    2017.3.31 spring mvc教程(一)核心类与接口
    19.创建如下三个类:(People类中的三个方法分别输出一些信息,ChinaPeople 和AmericanPeople类重写父类的三个方法)。
  • 原文地址:https://www.cnblogs.com/Chips/p/5405744.html
Copyright © 2011-2022 走看看