📄 _vector.h
字号:
} template <class _ForwardIterator> void _M_range_insert(iterator __position, _ForwardIterator __first, _ForwardIterator __last, const forward_iterator_tag &)#else /* _STLP_MEMBER_TEMPLATES */ void insert(iterator __position, const_iterator __first, const_iterator __last)#endif /* _STLP_MEMBER_TEMPLATES */ { if (__first != __last) { size_type __n = distance(__first, __last); if (size_type(this->_M_end_of_storage._M_data - this->_M_finish) >= __n) { const size_type __elems_after = this->_M_finish - __position; pointer __old_finish = this->_M_finish; if (__elems_after > __n) { __copy_trivial(this->_M_finish - __n, this->_M_finish, this->_M_finish); this->_M_finish += __n; __copy_backward_ptrs(__position, __old_finish - __n, __old_finish, _TrivialAss()); copy(__first, __last, __position); } else {# if defined ( _STLP_MEMBER_TEMPLATES ) _ForwardIterator __mid = __first; advance(__mid, __elems_after);# else const_pointer __mid = __first + __elems_after;# endif __uninitialized_copy(__mid, __last, this->_M_finish, _IsPODType()); this->_M_finish += __n - __elems_after; __copy_trivial(__position, __old_finish, this->_M_finish); this->_M_finish += __elems_after; copy(__first, __mid, __position); } /* elems_after */ } else { const size_type __old_size = size(); const size_type __len = __old_size + (max)(__old_size, __n); pointer __new_start = this->_M_end_of_storage.allocate(__len); pointer __new_finish = __new_start; _STLP_TRY { __new_finish = reinterpret_cast<pointer>(__ucopy_trivial(this->_M_start, __position, __new_start)); __new_finish = __uninitialized_copy(__first, __last, __new_finish, _IsPODType()); __new_finish = reinterpret_cast<pointer>(__ucopy_trivial(__position, this->_M_finish, __new_finish)); } _STLP_UNWIND(this->_M_end_of_storage.deallocate(__new_start,__len)); _M_clear(); _M_set(__new_start, __new_finish, __new_start + __len); } } } void insert (iterator __pos, size_type __n, void *__x) { _M_fill_insert(__pos, __n, __x); } void pop_back() { --this->_M_finish; } iterator erase(iterator __position) { if (__position + 1 != end()) __move_ptrs(__position + 1, this->_M_finish, __position, _TrivialAss()); --this->_M_finish; return __position; } iterator erase(iterator __first, iterator __last) { this->_M_finish = __move_ptrs(__last, this->_M_finish, __first, _TrivialAss()); return __first; }#if !defined(_STLP_DONT_SUP_DFLT_PARAM) void resize(size_type __new_size, void *__x = 0) {#else void resize(size_type __new_size, void *__x) {#endif /*_STLP_DONT_SUP_DFLT_PARAM*/ if (__new_size < size()) erase(begin() + __new_size, end()); else insert(end(), __new_size - size(), __x); }#if defined(_STLP_DONT_SUP_DFLT_PARAM) void resize(size_type __new_size) { resize(__new_size, static_cast<void*>(0)); }#endif /*_STLP_DONT_SUP_DFLT_PARAM*/ void clear() { erase(begin(), end()); }protected: void _M_clear() { this->_M_end_of_storage.deallocate(this->_M_start, this->_M_end_of_storage._M_data - this->_M_start); } void _M_set(pointer __s, pointer __f, pointer __e) { this->_M_start = __s; this->_M_finish = __f; this->_M_end_of_storage._M_data = __e; }#ifdef _STLP_MEMBER_TEMPLATES template <class _ForwardIterator> pointer _M_allocate_and_copy(size_type __n, _ForwardIterator __first, _ForwardIterator __last)#else /* _STLP_MEMBER_TEMPLATES */ pointer _M_allocate_and_copy(size_type __n, const_pointer __first, const_pointer __last)#endif /* _STLP_MEMBER_TEMPLATES */ { pointer __result = this->_M_end_of_storage.allocate(__n); _STLP_TRY {#if !defined(__MRC__) //*TY 12/17/2000 - added workaround for MrCpp. it confuses on nested try/catch block __uninitialized_copy(__first, __last, __result, _IsPODType());#else uninitialized_copy(__first, __last, __result);#endif return __result; } _STLP_UNWIND(this->_M_end_of_storage.deallocate(__result, __n)); _STLP_RET_AFTER_THROW(__result); }#ifdef _STLP_MEMBER_TEMPLATES template <class _InputIterator> void _M_range_initialize(_InputIterator __first, _InputIterator __last, const input_iterator_tag &) { for ( ; __first != __last; ++__first) push_back(*__first); } // This function is only called by the constructor. template <class _ForwardIterator> void _M_range_initialize(_ForwardIterator __first, _ForwardIterator __last, const forward_iterator_tag &) { size_type __n = distance(__first, __last); this->_M_start = this->_M_end_of_storage.allocate(__n); this->_M_end_of_storage._M_data = this->_M_start + __n; this->_M_finish = __uninitialized_copy(__first, __last, this->_M_start, _IsPODType()); }#endif /* _STLP_MEMBER_TEMPLATES */};# if !defined (_STLP_LINK_TIME_INSTANTIATION)# include <stl/pointers/_vector.c># endiftemplate <class _Tp, class _Alloc>class vector<_Tp*, _Alloc> _STLP_STLPORT_CLASS_1{ //Member datas as a void* vector: typedef typename _Alloc_traits<void*, _Alloc>::allocator_type _VoidAlloc; typedef vector<void*, _VoidAlloc> _Base; _Base _M_container; typedef __void_ptr_traits<_Tp> cast_traits; typedef vector<_Tp*, _Alloc> _Self;public: typedef _Tp* value_type; typedef value_type* pointer; typedef const value_type* const_pointer; typedef value_type* iterator; typedef const value_type* const_iterator;public: typedef value_type& reference; typedef value_type const_reference; typedef size_t size_type; typedef ptrdiff_t difference_type; typedef random_access_iterator_tag _Iterator_category; _STLP_DECLARE_RANDOM_ACCESS_REVERSE_ITERATORS; _STLP_FORCE_ALLOCATORS(value_type, _Alloc) typedef typename _Vector_base<value_type, _Alloc>::allocator_type allocator_type; /* allocator_type get_allocator() const { return _STLP_CONVERT_ALLOCATOR((const allocator_type&)this->_M_end_of_storage, value_type); } */public: iterator begin() { return cast_traits::ite_cast(_M_container.begin()); } const_iterator begin() const { return cast_traits::const_ite_cast(_M_container.begin()); } iterator end() { return cast_traits::ite_cast(_M_container.end()); } const_iterator end() const { return cast_traits::const_ite_cast(_M_container.end()); } 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()); } size_type size() const { return _M_container.size(); } size_type max_size() const { return _M_container.max_size(); } size_type capacity() const { return _M_container.capacity(); } bool empty() const { return _M_container.empty(); } reference operator[](size_type __n) { return cast_traits::ref_cast(_M_container[__n]); } const_reference operator[](size_type __n) const { return cast_traits::cast(_M_container[__n]); } reference front() { return cast_traits::ref_cast(_M_container.front()); } const_reference front() const { return cast_traits::cast(_M_container.front()); } reference back() { return cast_traits::ref_cast(_M_container.back()); } const_reference back() const { return cast_traits::cast(_M_container.back()); } reference at(size_type __n) { return cast_traits::ref_cast(_M_container.at(__n)); } const_reference at(size_type __n) const { return cast_traits::cast(_M_container.at(__n)); } explicit vector(const allocator_type& __a = allocator_type()) : _M_container(__a) {}#if !defined(_STLP_DONT_SUP_DFLT_PARAM) explicit vector(size_type __n, value_type __val = 0,#else vector(size_type __n, value_type __val,#endif /*_STLP_DONT_SUP_DFLT_PARAM*/ const allocator_type& __a = allocator_type()) : _M_container(__n, cast_traits::cast(__val), __a) {}#if defined(_STLP_DONT_SUP_DFLT_PARAM) explicit vector(size_type __n) : _M_container(__n, allocator_type() ) {}#endif /*_STLP_DONT_SUP_DFLT_PARAM*/ vector(const _Self& __x) : _M_container(__x._M_container) {} /*explicit vector(__full_move_source<_Self> src) : _Vector_base<value_type, _Alloc>(_FullMoveSource<_Vector_base<value_type, _Alloc> >(src.get())) { }*/ explicit vector(__partial_move_source<_Self> src) : _M_container(__partial_move_source<_Base>(src.get()._M_container)) {} #if defined (_STLP_MEMBER_TEMPLATES) // Check whether it's an integral type. If so, it's not an iterator. template <class _InputIterator> vector(_InputIterator __first, _InputIterator __last, const allocator_type& __a _STLP_ALLOCATOR_TYPE_DFL ) : _M_container(__iterator_wrapper<_Tp, _InputIterator>(__first), __iterator_wrapper<_Tp, _InputIterator>(__last), __a) {} # ifdef _STLP_NEEDS_EXTRA_TEMPLATE_CONSTRUCTORS template <class _InputIterator> vector(_InputIterator __first, _InputIterator __last) : _M_container(__iterator_wrapper<_Tp, _InputIterator>(__first), __iterator_wrapper<_Tp, _InputIterator>(__last)) {} # endif#else vector(const value_type* __first, const value_type* __last, const allocator_type& __a = allocator_type()) : _M_container(__first, __last, __a) {}#endif /* _STLP_MEMBER_TEMPLATES */ _Self& operator=(const _Self& __x) { _M_container = __x._M_container; return *this; } void reserve(size_type __n) {_M_container.reserve(__n);} void assign(size_type __n, value_type __val) { _M_container.assign(__n, cast_traits::cast(__val)); } #ifdef _STLP_MEMBER_TEMPLATES template <class _InputIterator> void assign(_InputIterator __first, _InputIterator __last) { _M_container.assign(__iterator_wrapper<_Tp, _InputIterator>(__first), __iterator_wrapper<_Tp, _InputIterator>(__last)); }#else void assign(const_iterator __first, const_iterator __last) {_M_container.assign(__first, __last);}#endif /* _STLP_MEMBER_TEMPLATES */#if !defined(_STLP_DONT_SUP_DFLT_PARAM) && !defined(_STLP_NO_ANACHRONISMS) void push_back(value_type __x = 0) {#else void push_back(value_type __x) {#endif /*!_STLP_DONT_SUP_DFLT_PARAM && !_STLP_NO_ANACHRONISMS*/ _M_container.push_back(cast_traits::cast(__x)); }#if !defined(_STLP_DONT_SUP_DFLT_PARAM) && !defined(_STLP_NO_ANACHRONISMS) iterator insert(iterator __pos, value_type __x = 0) {#else iterator insert(iterator __pos, value_type __x) {#endif /*!_STLP_DONT_SUP_DFLT_PARAM && !_STLP_NO_ANACHRONISMS*/ return cast_traits::ite_cast(_M_container.insert(cast_traits::ite_cast(__pos), cast_traits::cast(__x))); }#if defined(_STLP_DONT_SUP_DFLT_PARAM) && !defined(_STLP_NO_ANACHRONISMS) void push_back() { push_back(static_cast<value_type>(0)); } iterator insert(iterator __position) { return insert(__position, static_cast<value_type>(0)); }# endif /*_STLP_DONT_SUP_DFLT_PARAM && !_STLP_NO_ANACHRONISMS*/ void swap(_Self& __x) {_M_container.swap(__x._M_container);}#if defined ( _STLP_MEMBER_TEMPLATES) template <class _InputIterator> void insert(iterator __pos, _InputIterator __first, _InputIterator __last) { _M_container.insert(cast_traits::ite_cast(__pos), __iterator_wrapper<_Tp, _InputIterator>(__first), __iterator_wrapper<_Tp, _InputIterator>(__last)); }#else /* _STLP_MEMBER_TEMPLATES */ void insert(iterator __pos, const_iterator __first, const_iterator __last) { _M_container.insert(cast_traits::ite_cast(__pos), __first, __last); }#endif /* _STLP_MEMBER_TEMPLATES */ void insert (iterator __pos, size_type __n, value_type __x) { _M_container.insert(cast_traits::ite_cast(__pos), __n, cast_traits::cast(__x)); } void pop_back() {_M_container.pop_back();} iterator erase(iterator __pos) {return cast_traits::ite_cast(_M_container.erase(cast_traits::ite_cast(__pos)));} iterator erase(iterator __first, iterator __last) { return cast_traits::ite_cast(_M_container.erase(cast_traits::ite_cast(__first), cast_traits::ite_cast(__last))); }#if !defined(_STLP_DONT_SUP_DFLT_PARAM) void resize(size_type __new_size, value_type __x = 0) {#else void resize(size_type __new_size, value_type __x) {#endif /*_STLP_DONT_SUP_DFLT_PARAM*/ _M_container.resize(__new_size, cast_traits::cast(__x)); }#if defined(_STLP_DONT_SUP_DFLT_PARAM) void resize(size_type __new_size) { resize(__new_size, static_cast<value_type>(0)); }#endif /*_STLP_DONT_SUP_DFLT_PARAM*/ void clear() { _M_container.clear();}};#endif /* _STLP_SPECIALIZED_VECTOR_H */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -