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

📄 stl_vector.h

📁 gcc3.2.1源代码
💻 H
📖 第 1 页 / 共 3 页
字号:
	__throw_exception_again;      }  }  template <class _InputIterator>  void _M_range_initialize(_InputIterator __first,                           _InputIterator __last, 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, forward_iterator_tag)  {    size_type __n = distance(__first, __last);    _M_start = _M_allocate(__n);    _M_end_of_storage = _M_start + __n;    _M_finish = uninitialized_copy(__first, __last, _M_start);  }  template <class _InputIterator>  void _M_range_insert(iterator __pos,                       _InputIterator __first, _InputIterator __last,                       input_iterator_tag);  template <class _ForwardIterator>  void _M_range_insert(iterator __pos,                       _ForwardIterator __first, _ForwardIterator __last,                       forward_iterator_tag);};template <class _Tp, class _Alloc>inline booloperator==(const vector<_Tp, _Alloc>& __x, const vector<_Tp, _Alloc>& __y){  return __x.size() == __y.size() &&         equal(__x.begin(), __x.end(), __y.begin());}template <class _Tp, class _Alloc>inline booloperator<(const vector<_Tp, _Alloc>& __x, const vector<_Tp, _Alloc>& __y){  return lexicographical_compare(__x.begin(), __x.end(),                                 __y.begin(), __y.end());}template <class _Tp, class _Alloc>inline void swap(vector<_Tp, _Alloc>& __x, vector<_Tp, _Alloc>& __y){  __x.swap(__y);}template <class _Tp, class _Alloc>inline booloperator!=(const vector<_Tp, _Alloc>& __x, const vector<_Tp, _Alloc>& __y) {  return !(__x == __y);}template <class _Tp, class _Alloc>inline booloperator>(const vector<_Tp, _Alloc>& __x, const vector<_Tp, _Alloc>& __y) {  return __y < __x;}template <class _Tp, class _Alloc>inline booloperator<=(const vector<_Tp, _Alloc>& __x, const vector<_Tp, _Alloc>& __y) {  return !(__y < __x);}template <class _Tp, class _Alloc>inline booloperator>=(const vector<_Tp, _Alloc>& __x, const vector<_Tp, _Alloc>& __y) {  return !(__x < __y);}template <class _Tp, class _Alloc>vector<_Tp,_Alloc>&vector<_Tp,_Alloc>::operator=(const vector<_Tp, _Alloc>& __x){  if (&__x != this) {    const size_type __xlen = __x.size();    if (__xlen > capacity()) {      pointer __tmp = _M_allocate_and_copy(__xlen, __x.begin(), __x.end());      _Destroy(_M_start, _M_finish);      _M_deallocate(_M_start, _M_end_of_storage - _M_start);      _M_start = __tmp;      _M_end_of_storage = _M_start + __xlen;    }    else if (size() >= __xlen) {      iterator __i(copy(__x.begin(), __x.end(), begin()));      _Destroy(__i, end());    }    else {      copy(__x.begin(), __x.begin() + size(), _M_start);      uninitialized_copy(__x.begin() + size(), __x.end(), _M_finish);    }    _M_finish = _M_start + __xlen;  }  return *this;}template <class _Tp, class _Alloc>void vector<_Tp, _Alloc>::_M_fill_assign(size_t __n, const value_type& __val){  if (__n > capacity()) {    vector<_Tp, _Alloc> __tmp(__n, __val, get_allocator());    __tmp.swap(*this);  }  else if (__n > size()) {    fill(begin(), end(), __val);    _M_finish = uninitialized_fill_n(_M_finish, __n - size(), __val);  }  else    erase(fill_n(begin(), __n, __val), end());}template <class _Tp, class _Alloc> template <class _InputIter>void vector<_Tp, _Alloc>::_M_assign_aux(_InputIter __first, _InputIter __last,                                        input_iterator_tag) {  iterator __cur(begin());  for ( ; __first != __last && __cur != end(); ++__cur, ++__first)    *__cur = *__first;  if (__first == __last)    erase(__cur, end());  else    insert(end(), __first, __last);}template <class _Tp, class _Alloc> template <class _ForwardIter>voidvector<_Tp, _Alloc>::_M_assign_aux(_ForwardIter __first, _ForwardIter __last,                                   forward_iterator_tag) {  size_type __len = distance(__first, __last);  if (__len > capacity()) {    pointer __tmp(_M_allocate_and_copy(__len, __first, __last));    _Destroy(_M_start, _M_finish);    _M_deallocate(_M_start, _M_end_of_storage - _M_start);    _M_start = __tmp;    _M_end_of_storage = _M_finish = _M_start + __len;  }  else if (size() >= __len) {    iterator __new_finish(copy(__first, __last, _M_start));    _Destroy(__new_finish, end());    _M_finish = __new_finish.base();  }  else {    _ForwardIter __mid = __first;    advance(__mid, size());    copy(__first, __mid, _M_start);    _M_finish = uninitialized_copy(__mid, __last, _M_finish);  }}template <class _Tp, class _Alloc>voidvector<_Tp, _Alloc>::_M_insert_aux(iterator __position, const _Tp& __x){  if (_M_finish != _M_end_of_storage) {    _Construct(_M_finish, *(_M_finish - 1));    ++_M_finish;    _Tp __x_copy = __x;    copy_backward(__position, iterator(_M_finish - 2), iterator(_M_finish- 1));    *__position = __x_copy;  }  else {    const size_type __old_size = size();    const size_type __len = __old_size != 0 ? 2 * __old_size : 1;    iterator __new_start(_M_allocate(__len));    iterator __new_finish(__new_start);    try {      __new_finish = uninitialized_copy(iterator(_M_start), __position,                                        __new_start);      _Construct(__new_finish.base(), __x);      ++__new_finish;      __new_finish = uninitialized_copy(__position, iterator(_M_finish),                                        __new_finish);    }    catch(...)      {	_Destroy(__new_start,__new_finish);	_M_deallocate(__new_start.base(),__len);	__throw_exception_again;      }    _Destroy(begin(), end());    _M_deallocate(_M_start, _M_end_of_storage - _M_start);    _M_start = __new_start.base();    _M_finish = __new_finish.base();    _M_end_of_storage = __new_start.base() + __len;  }}template <class _Tp, class _Alloc>voidvector<_Tp, _Alloc>::_M_insert_aux(iterator __position){  if (_M_finish != _M_end_of_storage) {    _Construct(_M_finish, *(_M_finish - 1));    ++_M_finish;    copy_backward(__position, iterator(_M_finish - 2),		  iterator(_M_finish - 1));    *__position = _Tp();  }  else {    const size_type __old_size = size();    const size_type __len = __old_size != 0 ? 2 * __old_size : 1;    pointer __new_start = _M_allocate(__len);    pointer __new_finish = __new_start;    try {      __new_finish = uninitialized_copy(iterator(_M_start), __position,					__new_start);      _Construct(__new_finish);      ++__new_finish;      __new_finish = uninitialized_copy(__position, iterator(_M_finish),					__new_finish);    }    catch(...)      {	_Destroy(__new_start,__new_finish);	_M_deallocate(__new_start,__len);	__throw_exception_again;      }    _Destroy(begin(), end());    _M_deallocate(_M_start, _M_end_of_storage - _M_start);    _M_start = __new_start;    _M_finish = __new_finish;    _M_end_of_storage = __new_start + __len;  }}template <class _Tp, class _Alloc>void vector<_Tp, _Alloc>::_M_fill_insert(iterator __position, size_type __n,                                         const _Tp& __x){  if (__n != 0) {    if (size_type(_M_end_of_storage - _M_finish) >= __n) {      _Tp __x_copy = __x;      const size_type __elems_after = end() - __position;      iterator __old_finish(_M_finish);      if (__elems_after > __n) {        uninitialized_copy(_M_finish - __n, _M_finish, _M_finish);        _M_finish += __n;        copy_backward(__position, __old_finish - __n, __old_finish);        fill(__position, __position + __n, __x_copy);      }      else {        uninitialized_fill_n(_M_finish, __n - __elems_after, __x_copy);        _M_finish += __n - __elems_after;        uninitialized_copy(__position, __old_finish, _M_finish);        _M_finish += __elems_after;        fill(__position, __old_finish, __x_copy);      }    }    else {      const size_type __old_size = size();      const size_type __len = __old_size + max(__old_size, __n);      iterator __new_start(_M_allocate(__len));      iterator __new_finish(__new_start);      try {        __new_finish = uninitialized_copy(begin(), __position, __new_start);        __new_finish = uninitialized_fill_n(__new_finish, __n, __x);        __new_finish          = uninitialized_copy(__position, end(), __new_finish);      }      catch(...)	{	  _Destroy(__new_start,__new_finish);	  _M_deallocate(__new_start.base(),__len);	  __throw_exception_again;	}      _Destroy(_M_start, _M_finish);      _M_deallocate(_M_start, _M_end_of_storage - _M_start);      _M_start = __new_start.base();      _M_finish = __new_finish.base();      _M_end_of_storage = __new_start.base() + __len;    }  }}template <class _Tp, class _Alloc> template <class _InputIterator>voidvector<_Tp, _Alloc>::_M_range_insert(iterator __pos,                                     _InputIterator __first,                                     _InputIterator __last,                                     input_iterator_tag){  for ( ; __first != __last; ++__first) {    __pos = insert(__pos, *__first);    ++__pos;  }}template <class _Tp, class _Alloc> template <class _ForwardIterator>voidvector<_Tp, _Alloc>::_M_range_insert(iterator __position,                                     _ForwardIterator __first,                                     _ForwardIterator __last,                                     forward_iterator_tag){  if (__first != __last) {    size_type __n = distance(__first, __last);    if (size_type(_M_end_of_storage - _M_finish) >= __n) {      const size_type __elems_after = end() - __position;      iterator __old_finish(_M_finish);      if (__elems_after > __n) {        uninitialized_copy(_M_finish - __n, _M_finish, _M_finish);        _M_finish += __n;        copy_backward(__position, __old_finish - __n, __old_finish);        copy(__first, __last, __position);      }      else {        _ForwardIterator __mid = __first;        advance(__mid, __elems_after);        uninitialized_copy(__mid, __last, _M_finish);        _M_finish += __n - __elems_after;        uninitialized_copy(__position, __old_finish, _M_finish);        _M_finish += __elems_after;        copy(__first, __mid, __position);      }    }    else {      const size_type __old_size = size();      const size_type __len = __old_size + max(__old_size, __n);      iterator __new_start(_M_allocate(__len));      iterator __new_finish(__new_start);      try {        __new_finish = uninitialized_copy(iterator(_M_start),					  __position, __new_start);        __new_finish = uninitialized_copy(__first, __last, __new_finish);        __new_finish          = uninitialized_copy(__position, iterator(_M_finish), __new_finish);      }      catch(...)	{	  _Destroy(__new_start,__new_finish);	  _M_deallocate(__new_start.base(), __len);	  __throw_exception_again;	}      _Destroy(_M_start, _M_finish);      _M_deallocate(_M_start, _M_end_of_storage - _M_start);      _M_start = __new_start.base();      _M_finish = __new_finish.base();      _M_end_of_storage = __new_start.base() + __len;    }  }}} // namespace std#endif /* __GLIBCPP_INTERNAL_VECTOR_H */// Local Variables:// mode:C++// End:

⌨️ 快捷键说明

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