📄 vector
字号:
_Vb_iterator<_Alloc> operator+(typename _Alloc::difference_type _Off,
_Vb_iterator<_Alloc> _Right)
{ // return _Right + integer
return (_Right += _Off);
}
template<class _Alloc>
struct _Is_checked_helper<_Vb_iterator<_Alloc> >
: public _STD tr1::true_type
{ // mark _Vb_iterator as checked
};
// TEMPLATE CLASS _Vb_val
template<class _Alloc>
class _Vb_val
: public _Container_base
{ // base class for vector<bool> to hold data
public:
typedef typename _Alloc::template rebind<_Vbase>::other _Alty;
typedef typename _Alty::size_type size_type;
#if _ITERATOR_DEBUG_LEVEL == 0
_Vb_val(size_type _Count, bool _Val, _Alloc _Al = _Alloc())
: _Myvec(_Nw(_Count), (_Vbase)(_Val ? -1 : 0), _Al)
{ // construct _Count * _Val elements with allocator _Al
_Mysize = 0;
}
~_Vb_val()
{ // destroy proxy
}
#else /* _ITERATOR_DEBUG_LEVEL == 0 */
void _Buyproxy()
{ // allocate a proxy
typename _Alloc::template rebind<_Container_proxy>::other
_Alproxy(_Myvec.get_allocator());
this->_Myproxy = _Alproxy.allocate(1);
_Cons_val(_Alproxy, this->_Myproxy, _Container_proxy());
this->_Myproxy->_Mycont = this;
}
_Vb_val(size_type _Count, bool _Val, _Alloc _Al = _Alloc())
: _Myvec(_Nw(_Count), (_Vbase)(_Val ? -1 : 0), _Al)
{ // construct _Count * _Val elements with allocator _Al
_Buyproxy();
_Mysize = 0;
}
_Vb_val(const _Vb_val& _Right)
: _Myvec(_Right._Myvec), _Mysize(_Right._Mysize)
{ // copy construct
_Buyproxy();
}
~_Vb_val()
{ // destroy proxy
typename _Alloc::template rebind<_Container_proxy>::other
_Alproxy(_Myvec.get_allocator());
this->_Orphan_all();
_Dest_val(_Alproxy, this->_Myproxy);
_Alproxy.deallocate(this->_Myproxy, 1);
this->_Myproxy = 0;
}
#endif /* _ITERATOR_DEBUG_LEVEL == 0 */
static size_type _Nw(size_type _Count)
{ // return number of base words from number of bits
return ((_Count + _VBITS - 1) / _VBITS);
}
_STD vector<_Vbase, _Alty> _Myvec; // base vector of words
typename _Alty::size_type _Mysize; // current length of sequence
};
// CLASS vector<bool>
template<class _Alloc>
class vector<_Bool, _Alloc>
: public _Vb_val<_Alloc>
{ // varying size array of bits
public:
typedef typename _Alloc::size_type size_type;
typedef typename _Alloc::difference_type _Dift;
typedef _STD vector<_Vbase,
typename _Alloc::template rebind<_Vbase>::other>
_Vbtype;
typedef _STD vector<_Bool, _Alloc> _Myt;
typedef _Vb_val<_Alloc> _Mybase;
typedef _Dift difference_type;
typedef _Bool _Ty;
typedef _Alloc allocator_type;
typedef _Vb_reference<_Alloc> reference;
typedef bool const_reference;
typedef bool value_type;
typedef reference _Reft;
typedef _Vb_const_iterator<_Alloc> const_iterator;
typedef _Vb_iterator<_Alloc> iterator;
typedef iterator pointer;
typedef const_iterator const_pointer;
typedef _STD reverse_iterator<iterator> reverse_iterator;
typedef _STD reverse_iterator<const_iterator> const_reverse_iterator;
static const int _VBITS = _STD _VBITS;
vector()
: _Mybase(0, false)
{ // construct empty vector
}
vector(const _Myt& _Right)
: _Mybase(_Right)
{ // construct by copying _Right
}
explicit vector(const _Alloc& _Al)
: _Mybase(0, false, _Al)
{ // construct empty vector, with allocator
}
explicit vector(size_type _Count, bool _Val = false)
: _Mybase(_Count, _Val)
{ // construct from _Count * _Val
_Trim(_Count);
}
vector(size_type _Count, bool _Val, const _Alloc& _Al)
: _Mybase(_Count, _Val, _Al)
{ // construct from _Count * _Val, with allocator
_Trim(_Count);
}
template<class _Iter>
vector(_Iter _First, _Iter _Last)
: _Mybase(0, false)
{ // construct from [_First, _Last)
_BConstruct(_First, _Last, _Iter_cat(_First));
}
template<class _Iter>
vector(_Iter _First, _Iter _Last, const _Alloc& _Al)
: _Mybase(0, false, _Al)
{ // construct from [_First, _Last), with allocator
_BConstruct(_First, _Last, _Iter_cat(_First));
}
template<class _Iter>
void _BConstruct(_Iter _Count, _Iter _Val, _Int_iterator_tag)
{ // initialize from _Count * _Val
size_type _Num = (size_type)_Count;
this->_Myvec.assign(_Num, (_Ty)_Val ? -1 : 0);
_Trim(_Num);
}
template<class _Iter>
void _BConstruct(_Iter _First, _Iter _Last, input_iterator_tag)
{ // initialize from [_First, _Last), input iterators
insert(begin(), _First, _Last);
}
vector(_Myt&& _Right)
: _Mybase(0, false, _Right.get_allocator())
{ // construct by moving _Right
_Assign_rv(_STD move(_Right));
}
_Myt& operator=(_Myt&& _Right)
{ // assign by moving _Right
_Assign_rv(_STD move(_Right));
return (*this);
}
void _Assign_rv(_Myt&& _Right)
{ // assign by moving _Right
if (this == &_Right)
;
else if (get_allocator() != _Right.get_allocator())
*this = _Right;
else
{ // clear this and steal from _Right
clear();
this->_Swap_all((_Myt&)_Right);
this->_Mysize = _Right._Mysize;
_Right._Mysize = 0;
this->_Myvec = _STD move(_Right._Myvec);
}
}
void swap(_Myt&& _Right)
{ // exchange contents with movable _Right
_Assign_rv(_STD move(_Right));
}
~vector()
{ // destroy the object
this->_Mysize = 0;
}
_Myt& operator=(const _Myt& _Right)
{ // assign from _Right
this->_Mysize = _Right._Mysize;
this->_Myvec = _Right._Myvec;
return (*this);
}
void reserve(size_type _Count)
{ // determine new minimum length of allocated storage
this->_Myvec.reserve(this->_Nw(_Count));
}
size_type capacity() const
{ // return current length of allocated storage
return (this->_Myvec.capacity() * _VBITS);
}
iterator begin()
{ // return iterator for beginning of mutable sequence
return (iterator((_Vbase *)this->_Myvec._Myfirst, this));
}
const_iterator begin() const
{ // return iterator for beginning of nonmutable sequence
return (const_iterator((_Vbase *)this->_Myvec._Myfirst, this));
}
iterator end()
{ // return iterator for end of mutable sequence
iterator _Tmp = begin();
if (0 < this->_Mysize)
_Tmp += this->_Mysize;
return (_Tmp);
}
const_iterator end() const
{ // return iterator for end of nonmutable sequence
const_iterator _Tmp = begin();
if (0 < this->_Mysize)
_Tmp += this->_Mysize;
return (_Tmp);
}
#if _HAS_CPP0X
const_iterator cbegin() const
{ // return iterator for beginning of nonmutable sequence
return (((const _Myt *)this)->begin());
}
const_iterator cend() const
{ // return iterator for end of nonmutable sequence
return (((const _Myt *)this)->end());
}
const_reverse_iterator crbegin() const
{ // return iterator for beginning of reversed nonmutable sequence
return (((const _Myt *)this)->rbegin());
}
const_reverse_iterator crend() const
{ // return iterator for ebd of reversed nonmutable sequence
return (((const _Myt *)this)->rend());
}
void shrink_to_fit()
{ // reduce capacity
_Myt _Tmp(*this);
swap(_Tmp);
}
#endif /* _HAS_CPP0X */
iterator _Make_iter(const_iterator _Where)
{ // make iterator from const_iterator
iterator _Tmp = begin();
if (0 < this->_Mysize)
_Tmp += _Where - begin();
return (_Tmp);
}
reverse_iterator rbegin()
{ // return iterator for beginning of reversed mutable sequence
return (reverse_iterator(end()));
}
const_reverse_iterator rbegin() const
{ // return iterator for beginning of reversed nonmutable sequence
return (const_reverse_iterator(end()));
}
reverse_iterator rend()
{ // return iterator for end of reversed mutable sequence
return (reverse_iterator(begin()));
}
const_reverse_iterator rend() const
{ // return iterator for end of reversed nonmutable sequence
return (const_reverse_iterator(begin()));
}
void resize(size_type _Newsize, bool _Val = false)
{ // determine new length, padding with _Val elements as needed
if (size() < _Newsize)
_Insert_n(end(), _Newsize - size(), _Val);
else if (_Newsize < size())
erase(begin() + _Newsize, end());
}
size_type size() const
{ // return length of sequence
return (this->_Mysize);
}
size_type max_size() const
{ // return maximum possible length of sequence
const size_type _Maxsize = this->_Myvec.max_size();
return (_Maxsize < (size_type)(-1) / _VBITS
? _Maxsize * _VBITS : (size_type)(-1));
}
bool empty() const
{ // test if sequence is empty
return (size() == 0);
}
_Alloc get_allocator() const
{ // return allocator object for values
return (this->_Myvec.get_allocator());
}
const_reference at(size_type _Off) const
{ // subscript nonmutable sequence with checking
if (size() <= _Off)
_Xran();
return (*(begin() + _Off));
}
reference at(size_type _Off)
{ // subscript mutable sequence with checking
if (size() <= _Off)
_Xran();
return (*(begin() + _Off));
}
const_reference operator[](size_type _Off) const
{ // subscript nonmutable sequence
return (*(begin() + _Off));
}
reference operator[](size_type _Off)
{ // subscript mutable sequence
return (*(begin() + _Off));
}
reference front()
{ // return first element of mutable sequence
return (*begin());
}
const_reference front() const
{ // return first element of nonmutable sequence
return (*begin());
}
reference back()
{ // return last element of mutable sequence
return (*(end() - 1));
}
const_reference back() const
{ // return last element of nonmutable sequence
return (*(end() - 1));
}
void push_back(bool _Val)
{ // insert element at end
insert(end(), _Val);
}
void pop_back()
{ // erase element at end
if (!empty())
erase(end() - 1);
}
template<class _Iter>
void assign(_Iter _First, _Iter _Last)
{ // assign [_First, _Last)
_Assign(_First, _Last, _Iter_cat(_First));
}
template<class _Iter>
void _Assign(_Iter _Count, _Iter _Val, _Int_iterator_tag)
{ // assign _Count * _Val
_Assign_n((size_type)_Count, (bool)_Val);
}
template<class _Iter>
void _Assign(_Iter _First, _Iter _Last, input_iterator_tag)
{ // assign [_First, _Last), input iterators
erase(begin(), end());
insert(begin(), _First, _Last);
}
void assign(size_type _Count, bool _Val)
{ // assign _Count * _Val
_Assign_n(_Count, _Val);
}
iterator insert(const_iterator _Where, bool _Val)
{ // insert _Val at _Where
size_type _Off = _Where - begin();
_Insert_n(_Where, (size_type)1, _Val);
return (begin() + _Off);
}
void insert(const_iterator _Where, size_type _Count, bool _Val)
{ // insert _Count * _Val at _Where
_Insert_n(_Where, _Count, _Val);
}
template<class _Iter>
void insert(const_iterator _Where, _Iter _First, _Iter _Last)
{ // insert [_First, _Last) at _Where
_Insert(_Where, _First, _Last, _Iter_cat(_First));
}
template<class _Iter>
void _Insert(const_iterator _Where, _Iter _Count, _Iter _Val,
_Int_iterator_tag)
{ // insert _Count * _Val at _Where
_Insert_n(_Where, (size_type)_Count, (bool)_Val);
}
template<class _Iter>
void _Insert(const_iterator _Where, _Iter _First, _Iter _Last,
input_iterator_tag)
{ // insert [_First, _Last) at _Where, input iterators
size_type _Off = _Where - begin();
for (; _First != _Last; ++_First, ++_Off)
insert(begin() + _Off, *_First);
}
template<class _Iter>
void _Insert(const_iterator _Where,
_Iter _First, _Iter _Last,
forward_iterator_tag)
{ // insert [_First, _Last) at _Where, forward iterators
_DEBUG_RANGE(_First, _Last);
size_type _Count = 0;
_Distance(_First, _Last, _Count);
size_type _Off = _Insert_x(_Where, _Count);
_STD copy(_First, _Last, begin() + _Off);
}
iterator erase(const_iterator _Where_arg)
{ // erase element at _Where
iterator _Where = _Make_iter(_Where_arg);
size_type _Off = _Where - begin();
#if _ITERATOR_DEBUG_LEVEL == 2
if (end() <= _Where)
_DEBUG_ERROR("vector<bool> erase iterator outside range");
_STD copy(_Where + 1, end(), _Where);
_Orphan_range(_Off, this->_Mysize);
#else /* _ITERATOR_DEBUG_LEVEL == 2 */
_STD copy(_Where + 1, end(), _Where);
#endif /* _ITERATOR_DEBUG_LEVEL == 2 */
_Trim(this->_Mysize - 1);
return (begin() + _Off);
}
iterator erase(const_iterator _First_arg, const_iterator _Last_arg)
{ // erase [_First, _Last)
iterator _First = _Make_iter(_First_arg);
iterator _Last = _Make_iter(_Last_arg);
size_type _Off = _First - begin();
if (_First != _Last)
{ // worth doing, copy down over hole
#if _ITERATOR_DEBUG_LEVEL == 2
if (_Last < _First || end() < _Last)
_DEBUG_ERROR("vector<bool> erase iterator outside range");
iterator _Next = _STD copy(_Last, end(), _First);
size_type _Newsize = _Next - begin();
_Orphan_range(_Newsize, this->_Mysize);
_Trim(_Newsize);
#else /* _ITERATOR_DEBUG_LEVEL == 2 */
iterator _Next = _STD copy(_L
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -