⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 vector

📁 pwlib源码库
💻
📖 第 1 页 / 共 2 页
字号:
// vector standard header#if     _MSC_VER > 1000#pragma once#endif/* This file is for use only in conjunction with a valid license forMicrosoft Visual C++ V5.0. Microsoft Corporation is in no way involvedwith the production or release of this file. The file is offered on an``as is'' basis.DINKUMWARE, LTD. AND P.J. PLAUGER MAKE NO REPRESENTATIONS OR WARRANTIESABOUT THE SUITABILITY OF THIS FILE, EITHER EXPRESS OR IMPLIED,INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF MERCHANTABILITY,FITNESS FOR A PARTICULAR PURPOSE, OR NON-INFRINGEMENT. DINKUMWARE, LTD.AND P.J. PLAUGER SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BYLICENSEE AS A RESULT OF USING THIS FILE.For additional information, contact Dinkumware, Ltd. (+1-888-4DINKUM orsupport@dinkumware.com). */#ifndef _VECTOR_#define _VECTOR_#include <climits>#include <memory>#include <stdexcept>#include <xutility>#ifdef  _MSC_VER#pragma pack(push,8)#endif  /* _MSC_VER */_STD_BEGIN		// TEMPLATE CLASS vectortemplate<class _Ty, class _A = allocator<_Ty> >	class vector {public:	typedef vector<_Ty, _A> _Myt;	typedef _A allocator_type;	typedef _A::size_type size_type;	typedef _A::difference_type difference_type;	typedef _A::pointer _Tptr;	typedef _A::const_pointer _Ctptr;	typedef _A::reference reference;	typedef _A::const_reference const_reference;	typedef _A::value_type value_type;	typedef _Tptr iterator;	typedef _Ctptr const_iterator;	typedef reverse_iterator<const_iterator, value_type,		const_reference, _Ctptr, difference_type>			const_reverse_iterator;	typedef reverse_iterator<iterator, value_type,		reference, _Tptr, difference_type>			reverse_iterator;	explicit vector(const _A& _Al = _A())		: allocator(_Al), _First(0), _Last(0), _End(0) {}	explicit vector(size_type _N, const _Ty& _V = _Ty(),		const _A& _Al = _A())		: allocator(_Al)		{_First = allocator.allocate(_N, (void *)0);		_Ufill(_First, _N, _V);		_Last = _First + _N;		_End = _Last; }	vector(const _Myt& _X)		: allocator(_X.allocator)		{_First = allocator.allocate(_X.size(), (void *)0);		_Last = _Ucopy(_X.begin(), _X.end(), _First);		_End = _Last; }	typedef const_iterator _It;	vector(_It _F, _It _L, const _A& _Al = _A())		: allocator(_Al), _First(0), _Last(0), _End(0)		{insert(begin(), _F, _L); }	~vector()		{_Destroy(_First, _Last);		allocator.deallocate(_First, _End - _First);		_First = 0, _Last = 0, _End = 0; }	_Myt& operator=(const _Myt& _X)		{if (this == &_X)			;		else if (_X.size() <= size())			{iterator _S = copy(_X.begin(), _X.end(), _First);			_Destroy(_S, _Last);			_Last = _First + _X.size(); }		else if (_X.size() <= capacity())			{const_iterator _S = _X.begin() + size();			copy(_X.begin(), _S, _First);			_Ucopy(_S, _X.end(), _Last);			_Last = _First + _X.size(); }		else			{_Destroy(_First, _Last);			allocator.deallocate(_First, _End - _First);			_First = allocator.allocate(_X.size(), (void *)0);			_Last = _Ucopy(_X.begin(), _X.end(),				_First);			_End = _Last; }		return (*this); }	void reserve(size_type _N)		{if (capacity() < _N)			{iterator _S = allocator.allocate(_N, (void *)0);			_Ucopy(_First, _Last, _S);			_Destroy(_First, _Last);			allocator.deallocate(_First, _End - _First);			_End = _S + _N;			_Last = _S + size();			_First = _S; }}	size_type capacity() const		{return (_First == 0 ? 0 : _End - _First); }	iterator begin()		{return (_First); }	const_iterator begin() const		{return ((const_iterator)_First); }	iterator end()		{return (_Last); }	const_iterator end() const		{return ((const_iterator)_Last); }	reverse_iterator rbegin()		{return (reverse_iterator(end())); }	const_reverse_iterator rbegin() const		{return (const_reverse_iterator(end())); }	reverse_iterator rend()		{return (reverse_iterator(begin())); }	const_reverse_iterator rend() const		{return (const_reverse_iterator(begin())); }	void resize(size_type _N, const _Ty& _X = _Ty())		{if (size() < _N)			insert(end(), _N - size(), _X);		else if (_N < size())			erase(begin() + _N, end()); }	size_type size() const		{return (_First == 0 ? 0 : _Last - _First); }	size_type max_size() const		{return (allocator.max_size()); }	bool empty() const		{return (size() == 0); }	_A get_allocator() const		{return (allocator); }	const_reference at(size_type _P) const		{if (size() <= _P)			_Xran();		return (*(begin() + _P)); }	reference at(size_type _P)		{if (size() <= _P)			_Xran();		return (*(begin() + _P)); }	const_reference operator[](size_type _P) const		{return (*(begin() + _P)); }	reference operator[](size_type _P)		{return (*(begin() + _P)); }	reference front()		{return (*begin()); }	const_reference front() const		{return (*begin()); }	reference back()		{return (*(end() - 1)); }	const_reference back() const		{return (*(end() - 1)); }	void push_back(const _Ty& _X)		{insert(end(), _X); }	void pop_back()		{erase(end() - 1); }	void assign(_It _F, _It _L)		{erase(begin(), end());		insert(begin(), _F, _L); }	void assign(size_type _N, const _Ty& _X = _Ty())		{erase(begin(), end());		insert(begin(), _N, _X); }	iterator insert(iterator _P, const _Ty& _X = _Ty())		{size_type _O = _P - begin();		insert(_P, 1, _X);		return (begin() + _O); }	void insert(iterator _P, size_type _M, const _Ty& _X)		{if (_End - _Last < _M)			{size_type _N = size() + (_M < size() ? size() : _M);			iterator _S = allocator.allocate(_N, (void *)0);			iterator _Q = _Ucopy(_First, _P, _S);			_Ufill(_Q, _M, _X);			_Ucopy(_P, _Last, _Q + _M);			_Destroy(_First, _Last);                        size_type _O = size();			allocator.deallocate(_First, _End - _First);			_End = _S + _N;			_Last = _S + _O + _M;			_First = _S; }		else if (_Last - _P < _M)			{_Ucopy(_P, _Last, _P + _M);			_Ufill(_Last, _M - (_Last - _P), _X);			fill(_P, _Last, _X);			_Last += _M; }		else if (0 < _M)			{_Ucopy(_Last - _M, _Last, _Last);			copy_backward(_P, _Last - _M, _Last);			fill(_P, _P + _M, _X);			_Last += _M; }}	void insert(iterator _P, _It _F, _It _L)		{size_type _M = 0;		_Distance(_F, _L, _M);		if (_End - _Last < _M)			{size_type _N = size() + (_M < size() ? size() : _M);			iterator _S = allocator.allocate(_N, (void *)0);			iterator _Q = _Ucopy(_First, _P, _S);			_Q = _Ucopy(_F, _L, _Q);			_Ucopy(_P, _Last, _Q);			_Destroy(_First, _Last);                        size_type _O = size();			allocator.deallocate(_First, _End - _First);			_End = _S + _N;			_Last = _S + _O + _M;			_First = _S; }		else if (_Last - _P < _M)			{_Ucopy(_P, _Last, _P + _M);			_Ucopy(_F + (_Last - _P), _L, _Last);			copy(_F, _F + (_Last - _P), _P);			_Last += _M; }		else if (0 < _M)			{_Ucopy(_Last - _M, _Last, _Last);			copy_backward(_P, _Last - _M, _Last);			copy(_F, _L, _P);			_Last += _M; }}	iterator erase(iterator _P)		{copy(_P + 1, end(), _P);		_Destroy(_Last - 1, _Last);		--_Last;		return (_P); }	iterator erase(iterator _F, iterator _L)		{iterator _S = copy(_L, end(), _F);		_Destroy(_S, end());		_Last = _S;		return (_F); }	void clear()		{erase(begin(), end()); }	bool _Eq(const _Myt& _X) const		{return (size() == _X.size()			&& equal(begin(), end(), _X.begin())); }	bool _Lt(const _Myt& _X) const		{return (lexicographical_compare(begin(), end(),			_X.begin(), _X.end())); }	void swap(_Myt& _X)		{if (allocator == _X.allocator)			{std::swap(_First, _X._First);			std::swap(_Last, _X._Last);			std::swap(_End, _X._End); }		else			{_Myt _Ts = *this; *this = _X, _X = _Ts; }}	friend void swap(_Myt& _X, _Myt& _Y)		{_X.swap(_Y); }protected:	void _Destroy(iterator _F, iterator _L)		{for (; _F != _L; ++_F)			allocator.destroy(_F); }	iterator _Ucopy(const_iterator _F, const_iterator _L,		iterator _P)		{for (; _F != _L; ++_P, ++_F)			allocator.construct(_P, *_F);		return (_P); }	void _Ufill(iterator _F, size_type _N, const _Ty &_X)		{for (; 0 < _N; --_N, ++_F)			allocator.construct(_F, _X); }	void _Xran() const		{_THROW(out_of_range, "invalid vector<T> subscript"); }	_A allocator;	iterator _First, _Last, _End;	};		// CLASS vector<_Bool, allocator>typedef unsigned int _Vbase;const int _VBITS = CHAR_BIT * sizeof (_Vbase);typedef allocator<_Vbase> _Bool_allocator;class vector<_Bool, _Bool_allocator> {public:	typedef _Bool_allocator _A;	typedef _Bool _Ty;	typedef vector<_Ty, _A> _Myt;	typedef vector<_Vbase, _A> _Vbtype;	typedef _A allocator_type;	typedef _A::size_type size_type;	typedef _A::difference_type difference_type;		// CLASS reference	class reference {	public:		reference()			: _Mask(0), _Ptr(0) {}		reference(size_t _O, _Vbase *_P)			: _Mask((_Vbase)1 << _O), _Ptr(_P) {}		reference& operator=(const reference& _X)			{return (*this = bool(_X)); }		reference& operator=(bool _V)			{if (_V)				*_Ptr |= _Mask;			else				*_Ptr &= ~_Mask;			return (*this); }		void flip()			{*_Ptr ^= _Mask; }		bool operator~() const			{return (!bool(*this)); }		operator bool() const			{return ((*_Ptr & _Mask) != 0); }	protected:		_Vbase _Mask, *_Ptr;		};	typedef const reference const_reference;	typedef bool value_type;		// CLASS const_iterator	class iterator;	class const_iterator : public _Ranit<_Bool, difference_type> {	public:		const_iterator()			: _Off(0), _Ptr(0) {}		const_iterator(size_t _O, const _Vbase *_P)			: _Off(_O), _Ptr((_Vbase*)_P) {}		const_iterator(const iterator& _X)			: _Off(_X._Off), _Ptr(_X._Ptr) {}		const_reference operator*() const			{return (const_reference(_Off, _Ptr)); }		const_iterator& operator++()			{_Inc();			return (*this); }		const_iterator operator++(int)			{const_iterator _Tmp = *this;			_Inc();

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -