13. vector容器迭代器iterator自实现

Posted 为了财务自由!

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了13. vector容器迭代器iterator自实现相关的知识,希望对你有一定的参考价值。

以下是上一篇博客实现的带空间适配器alloctor的vector代码!

template<typename T>
struct Allocator

	//负责内存开辟
	T* allocate(size_t size)
	
		return (T*)malloc(sizeof(T)*size);
	
	//负责内存释放!
	void deallocate(void* p)
	
		free(p);
	
	//负责对象构造!
	void construct(T* p,const T&val)
	
		new(p) T(val);//定位new,在指定的地址(p)存放val
	
	void destroy(T* p)
	
		p->~T();//~T()代表T类型析构函数
	
;
//vector
template<typename T,typename Alloc = Allocator<T>>

public:
	vector(int size=10,const Alloc& alloc = Allocator<T>())
		:_allocator(alloc)
	
		//_first=new T[size];
		_first = _allocator.allocate(size);
		_last=_first;
		_end=_first+size;
	
	//析构容器有效个数的元素,然后释放_first指针指向的堆内存
	~vector()
	
		//delete[] _first;
		for(T* p=_first;p!=_last;++p)
		
			//把_first指针指向的数组有效元素进行析构操作
			_allocator.destory(p);
		
		_allocator.deallocate(_first);
		_first = _last = _end = nullptr;
	
	vector(const vector<T>& rhs)
	
		int size=rhs._end - rhs._first;
		//_first=new T[size];
		_first = _allocator.allocate(size);
		int len = rhs._last - rhs._first;
		for(int i=0;i<len;++i)
		
			//_first[i] = rhs._first[i];
			_allocator.construct(_first+i,rhs._first[i]);
		
		_last = _first+len;
		_end = _first+size;
	
	vector<T>& operator= (const vector<T>& rhs)
	
		if(this == &rhs)
			return ;
		//delete[] _first;
		for(T* p=_first;p!=_last;++p)
		
			//把_first指针指向的数组有效元素进行析构操作
			_allocator.destory(p);
		
		_allocator.deallocate(_first);
		
		int size=rhs._end - rhs._first;
		//_first=new T[size];
		_first = _allocator.allocate(size);
		int len = rhs._last - rhs._first;
		for(int i=0;i<len;++i)
		
			//_first[i] = rhs._first[i];
			_allocator.construct(_first+i,rhs._first[i]);
		
		_last = _first+len;
		_end = _first+size;
		return *this;
	
	void push_back(T& val)
	
		if(full())
			expand();
		//*_last=val;
		//_last++;
		_allocator.construct(_last,val);
		_last++;
	
	void pop_back()
	
		if(empty())
			return ;
		--_last;
		_allocator.destroy(_last);
	
	//返回容器末尾的值
	T back()const
	
		return *(_last-1);
	
	bool full()const
	
		return _last == _end;
	
	bool empty()const
	
		return _first == _last;
	
	int size()const
	
		return _last - _first;
	
	T& operator[](int index)
	
		if(index < 0 || index >=size())
		
			throw "OutOfRangeException";
		
		return _first[index];
	
	//迭代器一般实现成容器的嵌套类型
	class iterator
	
	public:
		iterator(T* ptr=nullptr)
			:_ptr(ptr)
		bool operator!=(const iterator& it)const
		
			return _ptr!=it._ptr;
		
		void operator++()//重载前置++
		
			_ptr++;
		
		T& operator*()
		
			return *_ptr;
		
		const T& operator*()const
		
			return *_ptr;
		
	private:
		T* _ptr;
	;
	//需要给容器提供begin和end方法
	iterator begin()return iterator(_first);
	iterator end()return iterator(_last);
private:
	T* _first;//指向数组起始位置
	T* _last;//指向数组中有效元素的后继位置
	T* _end;//指向数组空间的后继位置
	Alloc _allocator;//定义容器的空间适配器对象!
	void expand()//2倍扩容
	
		int size = _end - _first;
		//T* ptmp = new T[2*size];
		T* ptmp = _allocator.allocate(2*size);
		for(int i=0;i<size;i++)
		
			//ptmp[i] = _first[i];
			_allocator.construct(ptmp+i,_first[i]);
		
		//delete[] _first;
		for(T* p=_first;p!=_last;++p)
		
			_allocator.destroy(p);
		
		_allocator.deallocate(_first)
		_first = ptmp;
		_last = _fist + size;
		_end = _first + size*2;
	


以上是关于13. vector容器迭代器iterator自实现的主要内容,如果未能解决你的问题,请参考以下文章

容器vector 迭代器iterator 应用

vector

迭代器

迭代器

我为同学解难题⑬C++程序设计第6期:STL标准库之map容器

迭代器 iterator