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

📄 stl_deque.h

📁 著名的SGI的STL lib源码.(C++范型类编成,没有合适的分类,但是放到数据结构类别中也绝对适合)
💻 H
📖 第 1 页 / 共 3 页
字号:
    start.set_node(start.node - 1);    start.cur = start.last - 1;    construct(start.cur, t_copy);  }#     ifdef __STL_USE_EXCEPTIONS  catch(...) {    start.set_node(start.node + 1);    start.cur = start.first;    deallocate_node(*(start.node - 1));    throw;  }#     endif /* __STL_USE_EXCEPTIONS */} // Called only if finish.cur == finish.first.template <class T, class Alloc, size_t BufSize>void deque<T, Alloc, BufSize>:: pop_back_aux() {  deallocate_node(finish.first);  finish.set_node(finish.node - 1);  finish.cur = finish.last - 1;  destroy(finish.cur);}// Called only if start.cur == start.last - 1.  Note that if the deque//  has at least one element (a necessary precondition for this member//  function), and if start.cur == start.last, then the deque must have//  at least two nodes.template <class T, class Alloc, size_t BufSize>void deque<T, Alloc, BufSize>::pop_front_aux() {  destroy(start.cur);  deallocate_node(start.first);  start.set_node(start.node + 1);  start.cur = start.first;}      #ifdef __STL_MEMBER_TEMPLATES  template <class T, class Alloc, size_t BufSize>template <class InputIterator>void deque<T, Alloc, BufSize>::insert(iterator pos,                                      InputIterator first, InputIterator last,                                      input_iterator_tag) {  copy(first, last, inserter(*this, pos));}template <class T, class Alloc, size_t BufSize>template <class ForwardIterator>void deque<T, Alloc, BufSize>::insert(iterator pos,                                      ForwardIterator first,                                      ForwardIterator last,                                      forward_iterator_tag) {  size_type n = 0;  distance(first, last, n);  if (pos.cur == start.cur) {    iterator new_start = reserve_elements_at_front(n);    __STL_TRY {      uninitialized_copy(first, last, new_start);      start = new_start;    }    __STL_UNWIND(destroy_nodes_at_front(new_start));  }  else if (pos.cur == finish.cur) {    iterator new_finish = reserve_elements_at_back(n);    __STL_TRY {      uninitialized_copy(first, last, finish);      finish = new_finish;    }    __STL_UNWIND(destroy_nodes_at_back(new_finish));  }  else    insert_aux(pos, first, last, n);}#endif /* __STL_MEMBER_TEMPLATES */template <class T, class Alloc, size_t BufSize>typename deque<T, Alloc, BufSize>::iteratordeque<T, Alloc, BufSize>::insert_aux(iterator pos, const value_type& x) {  difference_type index = pos - start;  value_type x_copy = x;  if (index < size() / 2) {    push_front(front());    iterator front1 = start;    ++front1;    iterator front2 = front1;    ++front2;    pos = start + index;    iterator pos1 = pos;    ++pos1;    copy(front2, pos1, front1);  }  else {    push_back(back());    iterator back1 = finish;    --back1;    iterator back2 = back1;    --back2;    pos = start + index;    copy_backward(pos, back2, back1);  }  *pos = x_copy;  return pos;}template <class T, class Alloc, size_t BufSize>void deque<T, Alloc, BufSize>::insert_aux(iterator pos,                                          size_type n, const value_type& x) {  const difference_type elems_before = pos - start;  size_type length = size();  value_type x_copy = x;  if (elems_before < length / 2) {    iterator new_start = reserve_elements_at_front(n);    iterator old_start = start;    pos = start + elems_before;    __STL_TRY {      if (elems_before >= difference_type(n)) {        iterator start_n = start + difference_type(n);        uninitialized_copy(start, start_n, new_start);        start = new_start;        copy(start_n, pos, old_start);        fill(pos - difference_type(n), pos, x_copy);      }      else {        __uninitialized_copy_fill(start, pos, new_start, start, x_copy);        start = new_start;        fill(old_start, pos, x_copy);      }    }    __STL_UNWIND(destroy_nodes_at_front(new_start));  }  else {    iterator new_finish = reserve_elements_at_back(n);    iterator old_finish = finish;    const difference_type elems_after = difference_type(length) - elems_before;    pos = finish - elems_after;    __STL_TRY {      if (elems_after > difference_type(n)) {        iterator finish_n = finish - difference_type(n);        uninitialized_copy(finish_n, finish, finish);        finish = new_finish;        copy_backward(pos, finish_n, old_finish);        fill(pos, pos + difference_type(n), x_copy);      }      else {        __uninitialized_fill_copy(finish, pos + difference_type(n),                                  x_copy,                                  pos, finish);        finish = new_finish;        fill(pos, old_finish, x_copy);      }    }    __STL_UNWIND(destroy_nodes_at_back(new_finish));  }}#ifdef __STL_MEMBER_TEMPLATES  template <class T, class Alloc, size_t BufSize>template <class ForwardIterator>void deque<T, Alloc, BufSize>::insert_aux(iterator pos,                                          ForwardIterator first,                                          ForwardIterator last,                                          size_type n){  const difference_type elems_before = pos - start;  size_type length = size();  if (elems_before < length / 2) {    iterator new_start = reserve_elements_at_front(n);    iterator old_start = start;    pos = start + elems_before;    __STL_TRY {      if (elems_before >= difference_type(n)) {        iterator start_n = start + difference_type(n);         uninitialized_copy(start, start_n, new_start);        start = new_start;        copy(start_n, pos, old_start);        copy(first, last, pos - difference_type(n));      }      else {        ForwardIterator mid = first;        advance(mid, difference_type(n) - elems_before);        __uninitialized_copy_copy(start, pos, first, mid, new_start);        start = new_start;        copy(mid, last, old_start);      }    }    __STL_UNWIND(destroy_nodes_at_front(new_start));  }  else {    iterator new_finish = reserve_elements_at_back(n);    iterator old_finish = finish;    const difference_type elems_after = difference_type(length) - elems_before;    pos = finish - elems_after;    __STL_TRY {      if (elems_after > difference_type(n)) {        iterator finish_n = finish - difference_type(n);        uninitialized_copy(finish_n, finish, finish);        finish = new_finish;        copy_backward(pos, finish_n, old_finish);        copy(first, last, pos);      }      else {        ForwardIterator mid = first;        advance(mid, elems_after);        __uninitialized_copy_copy(mid, last, pos, finish, finish);        finish = new_finish;        copy(first, mid, pos);      }    }    __STL_UNWIND(destroy_nodes_at_back(new_finish));  }}#else /* __STL_MEMBER_TEMPLATES */template <class T, class Alloc, size_t BufSize>void deque<T, Alloc, BufSize>::insert_aux(iterator pos,                                          const value_type* first,                                          const value_type* last,                                          size_type n){  const difference_type elems_before = pos - start;  size_type length = size();  if (elems_before < length / 2) {    iterator new_start = reserve_elements_at_front(n);    iterator old_start = start;    pos = start + elems_before;    __STL_TRY {      if (elems_before >= difference_type(n)) {        iterator start_n = start + difference_type(n);        uninitialized_copy(start, start_n, new_start);        start = new_start;        copy(start_n, pos, old_start);        copy(first, last, pos - difference_type(n));      }      else {        const value_type* mid = first + (difference_type(n) - elems_before);        __uninitialized_copy_copy(start, pos, first, mid, new_start);        start = new_start;        copy(mid, last, old_start);      }    }    __STL_UNWIND(destroy_nodes_at_front(new_start));  }  else {    iterator new_finish = reserve_elements_at_back(n);    iterator old_finish = finish;    const difference_type elems_after = difference_type(length) - elems_before;    pos = finish - elems_after;    __STL_TRY {      if (elems_after > difference_type(n)) {        iterator finish_n = finish - difference_type(n);        uninitialized_copy(finish_n, finish, finish);        finish = new_finish;        copy_backward(pos, finish_n, old_finish);        copy(first, last, pos);      }      else {        const value_type* mid = first + elems_after;        __uninitialized_copy_copy(mid, last, pos, finish, finish);        finish = new_finish;        copy(first, mid, pos);      }    }    __STL_UNWIND(destroy_nodes_at_back(new_finish));  }}template <class T, class Alloc, size_t BufSize>void deque<T, Alloc, BufSize>::insert_aux(iterator pos,                                          const_iterator first,                                          const_iterator last,                                          size_type n){  const difference_type elems_before = pos - start;  size_type length = size();  if (elems_before < length / 2) {    iterator new_start = reserve_elements_at_front(n);    iterator old_start = start;    pos = start + elems_before;    __STL_TRY {      if (elems_before >= n) {        iterator start_n = start + n;        uninitialized_copy(start, start_n, new_start);        start = new_start;        copy(start_n, pos, old_start);        copy(first, last, pos - difference_type(n));      }      else {        const_iterator mid = first + (n - elems_before);        __uninitialized_copy_copy(start, pos, first, mid, new_start);        start = new_start;        copy(mid, last, old_start);      }    }    __STL_UNWIND(destroy_nodes_at_front(new_start));  }  else {    iterator new_finish = reserve_elements_at_back(n);    iterator old_finish = finish;    const difference_type elems_after = length - elems_before;    pos = finish - elems_after;    __STL_TRY {      if (elems_after > n) {        iterator finish_n = finish - difference_type(n);        uninitialized_copy(finish_n, finish, finish);        finish = new_finish;        copy_backward(pos, finish_n, old_finish);        copy(first, last, pos);      }      else {        const_iterator mid = first + elems_after;        __uninitialized_copy_copy(mid, last, pos, finish, finish);        finish = new_finish;        copy(first, mid, pos);      }    }    __STL_UNWIND(destroy_nodes_at_back(new_finish));  }}#endif /* __STL_MEMBER_TEMPLATES */template <class T, class Alloc, size_t BufSize>void deque<T, Alloc, BufSize>::new_elements_at_front(size_type new_elements) {  size_type new_nodes = (new_elements + buffer_size() - 1) / buffer_size();  reserve_map_at_front(new_nodes);  size_type i;  __STL_TRY {    for (i = 1; i <= new_nodes; ++i)      *(start.node - i) = allocate_node();  }#       ifdef __STL_USE_EXCEPTIONS  catch(...) {    for (size_type j = 1; j < i; ++j)      deallocate_node(*(start.node - j));          throw;  }#       endif /* __STL_USE_EXCEPTIONS */}template <class T, class Alloc, size_t BufSize>void deque<T, Alloc, BufSize>::new_elements_at_back(size_type new_elements) {  size_type new_nodes = (new_elements + buffer_size() - 1) / buffer_size();  reserve_map_at_back(new_nodes);  size_type i;  __STL_TRY {    for (i = 1; i <= new_nodes; ++i)      *(finish.node + i) = allocate_node();  }#       ifdef __STL_USE_EXCEPTIONS  catch(...) {    for (size_type j = 1; j < i; ++j)      deallocate_node(*(finish.node + j));          throw;  }#       endif /* __STL_USE_EXCEPTIONS */}template <class T, class Alloc, size_t BufSize>void deque<T, Alloc, BufSize>::destroy_nodes_at_front(iterator before_start) {  for (map_pointer n = before_start.node; n < start.node; ++n)    deallocate_node(*n);}template <class T, class Alloc, size_t BufSize>void deque<T, Alloc, BufSize>::destroy_nodes_at_back(iterator after_finish) {  for (map_pointer n = after_finish.node; n > finish.node; --n)    deallocate_node(*n);}template <class T, class Alloc, size_t BufSize>void deque<T, Alloc, BufSize>::reallocate_map(size_type nodes_to_add,                                              bool add_at_front) {  size_type old_num_nodes = finish.node - start.node + 1;  size_type new_num_nodes = old_num_nodes + nodes_to_add;  map_pointer new_nstart;  if (map_size > 2 * new_num_nodes) {    new_nstart = map + (map_size - new_num_nodes) / 2                      + (add_at_front ? nodes_to_add : 0);    if (new_nstart < start.node)      copy(start.node, finish.node + 1, new_nstart);    else      copy_backward(start.node, finish.node + 1, new_nstart + old_num_nodes);  }  else {    size_type new_map_size = map_size + max(map_size, nodes_to_add) + 2;    map_pointer new_map = map_allocator::allocate(new_map_size);    new_nstart = new_map + (new_map_size - new_num_nodes) / 2                         + (add_at_front ? nodes_to_add : 0);    copy(start.node, finish.node + 1, new_nstart);    map_allocator::deallocate(map, map_size);    map = new_map;    map_size = new_map_size;  }  start.set_node(new_nstart);  finish.set_node(new_nstart + old_num_nodes - 1);}// Nonmember functions.#ifndef __STL_NON_TYPE_TMPL_PARAM_BUGtemplate <class T, class Alloc, size_t BufSiz>bool operator==(const deque<T, Alloc, BufSiz>& x,                const deque<T, Alloc, BufSiz>& y) {  return x.size() == y.size() && equal(x.begin(), x.end(), y.begin());}template <class T, class Alloc, size_t BufSiz>bool operator<(const deque<T, Alloc, BufSiz>& x,               const deque<T, Alloc, BufSiz>& y) {  return lexicographical_compare(x.begin(), x.end(), y.begin(), y.end());}#endif /* __STL_NON_TYPE_TMPL_PARAM_BUG */#if defined(__STL_FUNCTION_TMPL_PARTIAL_ORDER) && \    !defined(__STL_NON_TYPE_TMPL_PARAM_BUG)template <class T, class Alloc, size_t BufSiz>inline void swap(deque<T, Alloc, BufSiz>& x, deque<T, Alloc, BufSiz>& y) {  x.swap(y);}#endif#if defined(__sgi) && !defined(__GNUC__) && (_MIPS_SIM != _MIPS_SIM_ABI32)#pragma reset woff 1174#endif          __STL_END_NAMESPACE   #endif /* __SGI_STL_INTERNAL_DEQUE_H */// Local Variables:// mode:C++// End:

⌨️ 快捷键说明

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