STL源码:list

   相较于vector的连续线性空间,list就显得复杂许多,它的好处是每次插入或删除一个元素,就配置或释放一个元素空间。因此,list对于空间的运用有绝对的精准,一点也不浪费。而且,对于任何位置的元素插入或元素移除,list永远是常数时间。

      list不仅是一个双向链表,而且还是一个环状双向链表,因此迭代器必须具备前移和后移能力,所以list使用Bidirectional Iterators。

      list还有一个重要性质,插入操作和接合操作都不会造成原有的list迭代器失效,这在vector是不成立的。因为vector的插入操作可能造成记忆体重新配置,导致原有的迭代器全部失效。甚至list的元素删除操作(erase),也只有“指向被删除元素”的那个迭代器失效,其他迭代器不受任何影响

        list和vector是两个常用的容器。什么时候最适合哪一个,必须视元素多寡、元素构造复杂程度、元素存取行为特性等而定。

list节点结构和list的数据结构

list本身和list节点的结构是不同的。STL list节点结构如下:

  1. template <class T>  
  2. struct __list_node  
  3. {  
  4.   typedef void* void_pointer;  
  5.   void_pointer next;  
  6.   void_pointer prev;  
  7.   T data;  
  8. };  

list头结点仅需要一个指针,其结构:
  1. template <class T, class Alloc = alloc>   //缺省使用alloc为配置器  
  2. class list {  
  3. protected:  
  4.    typedef __list_node<T> list_node;  
  5. public:  
  6.    typedef list_node * link_type;  
  7. protected:  
  8.    link_type node;     //只要一个指针,便可以表示整个环状链表,头指针  
  9. ...  
  10. };   

  1. stl_list.h   
  2. // Filename:    stl_list.h  
  3. /* NOTE: This is an internal header file, included by other STL headers. 
  4.  *   You should not attempt to use it directly. 
  5.  */  
  6.   
  7. #ifndef __SGI_STL_INTERNAL_LIST_H  
  8. #define __SGI_STL_INTERNAL_LIST_H  
  9.   
  10. __STL_BEGIN_NAMESPACE  
  11.   
  12. #if defined(__sgi) && !defined(__GNUC__) && (_MIPS_SIM != _MIPS_SIM_ABI32)  
  13. #pragma set woff 1174  
  14. #endif  
  15.   
  16.   
  17. // list结点, 提供双向访问能力  
  18.   
  19.   
  20. template <class T>  
  21. struct __list_node      // list节点的结构  
  22. {  
  23.   typedef void* void_pointer;  
  24.   void_pointer next;  
  25.   void_pointer prev;  
  26.   T data;  
  27. };  
  28.   
  29. ///  
  30. //list迭代器的设计  
  31. ///  
  32. template<class T, class Ref, class Ptr>  
  33. struct __list_iterator  
  34. {  
  35.   // 标记为'STL标准强制要求'的typedefs用于提供iterator_traits<I>支持  
  36.   typedef __list_iterator<T, T&, T*>             iterator;       // STL标准强制要求  
  37.   typedef __list_iterator<T, const T&, const T*> const_iterator;  
  38.   typedef __list_iterator<T, Ref, Ptr>           self;  
  39.   
  40.   typedef bidirectional_iterator_tag iterator_category;  
  41.   typedef T value_type;                                 // STL标准强制要求  
  42.   typedef Ptr pointer;                                  // STL标准强制要求  
  43.   typedef Ref reference;                                // STL标准强制要求  
  44.   typedef __list_node<T>* link_type;  
  45.   typedef size_t size_type;  
  46.   typedef ptrdiff_t difference_type;                    // STL标准强制要求  
  47.   
  48.   // 这个是迭代器实际管理的资源指针  
  49.   link_type node;                  //只要一个指针,便可以表示整个环状链表,头指针  
  50.   
  51. //迭代器构造函数  
  52.   __list_iterator(link_type x) : node(x) {}  
  53.   __list_iterator() {}  
  54.   __list_iterator(const iterator& x) : node(x.node) {}  
  55.   
  56.   // 在STL算法中需要迭代器提供支持  
  57.   bool operator==(const self& x) const { return node == x.node; }  
  58.   bool operator!=(const self& x) const { return node != x.node; }  
  59.   
  60.   // 重载operator *, 对迭代器取值,返回实际维护的数据  
  61.   reference operator*() const { return (*node).data; }  
  62.   
  63. #ifndef __SGI_STL_NO_ARROW_OPERATOR  
  64.   // 如果支持'->'则重载之  
  65.   // 解释一下为什么要返回地址  
  66.   // class A  
  67.   // {  
  68.   // public:  
  69.   //    // ...  
  70.   //    void fun();  
  71.   //    // ...  
  72.   // }  
  73.   // __list_iterator<A, A&, A*> iter(new A)  
  74.   // iter->fun();  
  75.   // 这就相当于调用(iter.operator())->fun();  
  76.   // 经过重载使其行为和原生指针一致  
  77.   pointer operator->() const { return &(operator*()); }  
  78. #endif /* __SGI_STL_NO_ARROW_OPERATOR */  
  79.   
  80.   // 前缀自加  
  81.   self& operator++()  
  82.   {  
  83.     node = (link_type)((*node).next);  
  84.     return *this;  
  85.   }  
  86.   
  87.   // 后缀自加, 需要先产生自身的一个副本, 然会再对自身操作, 最后返回副本  
  88.   self operator++(int)  
  89.   {  
  90.     self tmp = *this;  
  91.     ++*this;  
  92.     return tmp;  
  93.   }  
  94.   
  95.   self& operator--()  
  96.   {  
  97.     node = (link_type)((*node).prev);  
  98.     return *this;  
  99.   }  
  100.   
  101.   self operator--(int)  
  102.   {  
  103.     self tmp = *this;  
  104.     --*this;  
  105.     return tmp;  
  106.   }  
  107. };  
  108.   
  109. // 如果编译器支持模板类偏特化那么就不需要提供以下traits函数  
  110. // 直接使用<stl_iterator.h>中的  
  111. // template <class Iterator>  
  112. // struct iterator_traits  
  113. #ifndef __STL_CLASS_PARTIAL_SPECIALIZATION  
  114.   
  115. template <class T, class Ref, class Ptr>  
  116. inline bidirectional_iterator_tag  
  117. iterator_category(const __list_iterator<T, Ref, Ptr>&) {  
  118.   return bidirectional_iterator_tag();  
  119. }  
  120.   
  121. template <class T, class Ref, class Ptr>  
  122. inline T*  
  123. value_type(const __list_iterator<T, Ref, Ptr>&) {  
  124.   return 0;  
  125. }  
  126.   
  127. template <class T, class Ref, class Ptr>  
  128. inline ptrdiff_t*  
  129. distance_type(const __list_iterator<T, Ref, Ptr>&) {  
  130.   return 0;  
  131. }  
  132.   
  133. #endif /* __STL_CLASS_PARTIAL_SPECIALIZATION */  
  134.   
  135. // 默认allocator为alloc, 其具体使用版本请参照<stl_alloc.h>  
  136. template <class T, class Alloc = alloc>  
  137. class list  
  138. {  
  139. protected:  
  140.   typedef void* void_pointer;  
  141.   typedef __list_node<T> list_node;  
  142.   
  143.   // 这个提供STL标准的allocator接口  
  144.   //list缺省使用alloc作为空间配置器并据此定义了list_node_allocator  
  145.   // 专属之空间配置器,可以方便地每次配置一个节点大小  
  146.   typedef simple_alloc<list_node, Alloc> list_node_allocator;  
  147.   
  148. public:  
  149.   typedef T value_type;  
  150.   typedef value_type* pointer;  
  151.   typedef const value_type* const_pointer;  
  152.   typedef value_type& reference;  
  153.   typedef const value_type& const_reference;  
  154.   typedef list_node* link_type;  
  155.   typedef size_t size_type;  
  156.   typedef ptrdiff_t difference_type;  
  157.   
  158. public:  
  159.   typedef __list_iterator<T, T&, T*>             iterator;  
  160.   typedef __list_iterator<T, const T&, const T*> const_iterator;  
  161.   
  162. #ifdef __STL_CLASS_PARTIAL_SPECIALIZATION  
  163.   typedef reverse_iterator<const_iterator> const_reverse_iterator;  
  164.   typedef reverse_iterator<iterator> reverse_iterator;  
  165. #else /* __STL_CLASS_PARTIAL_SPECIALIZATION */  
  166.   typedef reverse_bidirectional_iterator<const_iterator, value_type,  
  167.   const_reference, difference_type>  
  168.   const_reverse_iterator;  
  169.   typedef reverse_bidirectional_iterator<iterator, value_type, reference,  
  170.   difference_type>  
  171.   reverse_iterator;  
  172. #endif /* __STL_CLASS_PARTIAL_SPECIALIZATION */  
  173.   
  174. protected:  
  175.   // 使用上述的专属空间配置器list_node_allocator(n)配置n新结点  
  176.   //以下四个函数分别用于配置、释放、构造、销毁一个节点  
  177.   
  178.   //该函数配置一个节点并回传  
  179.   link_type get_node() { return list_node_allocator::allocate(); }  
  180.   
  181.   // 释放指定结点, 不进行析构, 析构交给全局的destroy,  
  182.   // 见<stl_stl_uninitialized.h>  
  183.   void put_node(link_type p) { list_node_allocator::deallocate(p); }  
  184.   
  185.   // 创建结点, 首先分配内存, 然后进行构造,有元素值  
  186.   // 注: commit or rollback  
  187.   link_type create_node(const T& x)  
  188.   {  
  189.     link_type p = get_node();  
  190.     __STL_TRY {  
  191.       construct(&p->data, x);  //全局函数,构造/析构基本工具  
  192.     }  
  193.     __STL_UNWIND(put_node(p));  
  194.     return p;  
  195.   }  
  196.   
  197.   // 析构结点元素, 并释放内存  
  198.   void destroy_node(link_type p)  
  199.   {  
  200.     destroy(&p->data);   //全局函数,构造/析构基本工具  
  201.     put_node(p);  
  202.   }  
  203.   
  204. protected:  
  205.     
  206.   void empty_initialize()  
  207.   {  
  208.     node = get_node();  //配置一个节点空间,令node指向它  
  209.     node->next = node;  //令node头尾指向自己,不设置元素值  
  210.     node->prev = node;  
  211.   }  
  212.   
  213.   // 创建值为value共n个结点的链表  
  214.   // 注: commit or rollback  
  215.   void fill_initialize(size_type n, const T& value)  
  216.   {  
  217.     empty_initialize();  
  218.     __STL_TRY {  
  219.       // 此处插入操作时间复杂度O(1)  
  220.       insert(begin(), n, value);  
  221.     }  
  222.     __STL_UNWIND(clear(); put_node(node));  
  223.   }  
  224.   
  225. // 以一个区间初始化链表  
  226. // 注: commit or rollback  
  227. #ifdef __STL_MEMBER_TEMPLATES  
  228.   template <class InputIterator>  
  229.   void range_initialize(InputIterator first, InputIterator last)  
  230.   {  
  231.     empty_initialize();  
  232.     __STL_TRY {  
  233.       insert(begin(), first, last);  
  234.     }  
  235.     __STL_UNWIND(clear(); put_node(node));  
  236.   }  
  237. #else  /* __STL_MEMBER_TEMPLATES */  
  238.   void range_initialize(const T* first, const T* last) {  
  239.     empty_initialize();  
  240.     __STL_TRY {  
  241.       insert(begin(), first, last);  
  242.     }  
  243.     __STL_UNWIND(clear(); put_node(node));  
  244.   }  
  245.   void range_initialize(const_iterator first, const_iterator last) {  
  246.     empty_initialize();  
  247.     __STL_TRY {  
  248.       insert(begin(), first, last);  
  249.     }  
  250.     __STL_UNWIND(clear(); put_node(node));  
  251.   }  
  252. #endif /* __STL_MEMBER_TEMPLATES */  
  253.   
  254. protected:  
  255.   link_type node;  //这个是链表头结点, 其本身不保存数据  
  256.   
  257. public:  
  258.    //用于空链表的建立,不用指定任何参数  
  259.    //empty_initialize()函数的实现在是上面  
  260. list() {     empty_initialize(); }   
  261. iterator begin() {     return (link_type)((*node).next); }   
  262. const_iterator begin() const {     return (link_type)((*node).next); }  
  263.   
  264. //让头节点node指向可以置于尾端的一个空节点,node便能符合  
  265. //STL对于“前闭后开”区间的要求,成为last迭代器。这样的话,  
  266. //begin(),end(),empty(),size(),front(),back()等函数都能轻易完成   
  267. iterator end() { return node; } //链表为环,所以头节点就是end   
  268. const_iterator end() const { return node; }   
  269. reverse_iterator rbegin() { return reverse_iterator(end()); }   
  270. const_reverse_iterator rbegin() const {   
  271.     return const_reverse_iterator(end());   
  272. }   
  273. reverse_iterator rend() { return reverse_iterator(begin()); }   
  274. const_reverse_iterator rend() const {   
  275.     return const_reverse_iterator(begin());   
  276. }   
  277.   
  278. // 头结点指向自身说明链表中无元素   
  279. bool empty() const { return node->next == node; }   
  280.   
  281. // 使用全局函数distance()进行计算, 时间复杂度O(n)   
  282. size_type size() const {   
  283.     size_type result = 0;   
  284.     distance(begin(), end(), result);   
  285.     return result;   
  286. }   
  287. size_type max_size() const {    return size_type(-1); }   
  288. reference front() { return *begin(); }   
  289. const_reference front() const { return *begin(); }   
  290. //end指向的是一个空白节点,所以要先自减再求值   
  291. reference back() { return *(--end()); }   
  292. const_reference back() const { return *(--end()); }   
  293. void swap(list<T, Alloc>& x) { __STD::swap(node, x.node);   
  294.   
  295. //在迭代器position位置插入一个节点,内容为x   
  296. iterator insert(iterator position, const T& x)   
  297. {   
  298.     link_type tmp = create_node(x); //产生节点,内容为x   
  299.     tmp->next = position.node;   
  300.     tmp->prev = position.node->prev;   
  301.     (link_type(position.node->prev))->next = tmp;  
  302.     position.node->prev = tmp;  
  303.     return tmp;   
  304. }   
  305.   
  306. iterator insert(iterator position) { return insert(position, T()); }  
  307. #ifdef __STL_MEMBER_TEMPLATES   
  308. template <class InputIterator>   
  309. void insert(iterator position, InputIterator first, InputIterator last);  
  310. #else /* __STL_MEMBER_TEMPLATES */   
  311. void insert(iterator position, const T* first, const T* last);   
  312. void insert(iterator position, const_iterator first, const_iterator last);  
  313. #endif /* __STL_MEMBER_TEMPLATES */   
  314.   
  315. // 指定位置插入n个值为x的元素, 详细解析见实现部分   
  316. void insert(iterator pos, size_type n, const T& x);   
  317. void insert(iterator pos, int n, const T& x)   
  318. {   
  319.     insert(pos, (size_type)n, x);   
  320. }   
  321. void insert(iterator pos, long n, const T& x)   
  322. {   
  323.     insert(pos, (size_type)n, x);  
  324. }   
  325.   
  326. // 在链表前端插入结点,以下两个函数调用insert()   
  327. void push_front(const T& x) { insert(begin(), x); }   
  328. // 在链表最后插入结点   
  329. void push_back(const T& x) { insert(end(), x); }   
  330.   
  331. // 擦除指定结点   
  332. iterator erase(iterator position)   
  333. {   
  334.     link_type next_node = link_type(position.node->next);   
  335.     link_type prev_node = link_type(position.node->prev);   
  336.     prev_node->next = next_node;   
  337.     next_node->prev = prev_node;   
  338.     destroy_node(position.node);   
  339.     return iterator(next_node);   
  340. }   
  341. // 擦除一个区间的结点, 详细解析见实现部分   
  342. iterator erase(iterator first, iterator last);   
  343. void resize(size_type new_size, const T& x);  
  344. void resize(size_type new_size) { resize(new_size, T()); }   
  345. void clear();   
  346.   
  347. // 删除链表第一个结点   
  348. void pop_front() { erase(begin()); }   
  349.   
  350. // 删除链表最后一个结点   
  351. void pop_back() {   
  352.     iterator tmp = end();   
  353.     erase(--tmp);   
  354. }   
  355.   
  356. list(size_type n, const T& value) { fill_initialize(n, value); }   
  357. list(int n, const T& value) { fill_initialize(n, value); }   
  358. list(long n, const T& value) { fill_initialize(n, value); }   
  359. explicit list(size_type n) { fill_initialize(n, T()); }  
  360.   
  361. // 以一个区间元素为蓝本创建链表  
  362. #ifdef __STL_MEMBER_TEMPLATES   
  363. template <class InputIterator>   
  364. list(InputIterator first, InputIterator last)   
  365. {   
  366.     range_initialize(first, last);   
  367. }#else /* __STL_MEMBER_TEMPLATES */   
  368.     list(const T* first, const T* last) { range_initialize(first, last); }   
  369.     list(const_iterator first, const_iterator last) {   
  370.         range_initialize(first, last);   
  371.     }  
  372. #endif /* __STL_MEMBER_TEMPLATES */   
  373.   
  374. // 复制构造  
  375.     list(const list<T, Alloc>& x) {   
  376.         range_initialize(x.begin(), x.end());   
  377.     }   
  378.   
  379.     ~list()   
  380.     {   
  381.         // 释放所有结点   
  382.         // 使用全局函数distance()进行计算, 时间复杂度O(n)   
  383.         size_type size() const {   
  384.             size_type result = 0;  
  385.             distance(begin(), end(), result);   
  386.             return result;   
  387.         }   
  388.         clear();   
  389.         // 释放头结点   
  390.         put_node(node);   
  391.     }   
  392.     list<T, Alloc>& operator=(const list<T, Alloc>& x);  
  393. protected:  
  394.   
  395. // 将[first, last)区间插入到position  
  396. // 如果last == position, 则相当于链表不变化, 不进行操作  
  397. //list内部提供所谓的迁移操作(transfer):将某连续范围内元素迁移到某个特定位置  
  398. //之前。技术上很简单,节点间指针移动而已。该操作为其它复杂操作如splic、sort  
  399. //以及merge等奠定了良好的基础  
  400. //该函数将[first,last)内所有元素移动到position之前  
  401. //该函数接收的[last,last)区间可以在同一list中,也可以不再同一list内。  
  402. //但是,position不能位于[first, last)  
  403. //代码下方有该函数的图示  
  404. void transfer(iterator position, iterator first, iterator last) {   
  405.     if (position != last) {   
  406.         (*(link_type((*last.node).prev))).next = position.node;   
  407.         (*(link_type((*first.node).prev))).next = last.node;   
  408.         (*(link_type((*position.node).prev))).next = first.node;   
  409.         link_type tmp = link_type((*position.node).prev);   
  410.         (*position.node).prev = (*last.node).prev;   
  411.         (*last.node).prev = (*first.node).prev;   
  412.         (*first.node).prev = tmp; } }  
  413. public:   
  414.     // 将链表x移动到position之前   
  415.     void splice(iterator position, list& x) {   
  416.         if (!x.empty())   
  417.             transfer(position, x.begin(), x.end());   
  418.     }   
  419.   
  420.     // 将链表中i指向的内容移动到position之前   
  421.     void splice(iterator position, list&, iterator i) {   
  422.         iterator j = i;   
  423.         ++j;   
  424.         if (position == i || position == j)   
  425.             return;   
  426.         transfer(position, i, j);   
  427.     }   
  428.   
  429.     // 将[first, last}元素移动到position之前   
  430.     void splice(iterator position, list&, iterator first, iterator last) {   
  431.         if (first != last) transfer(position, first, last);   
  432.     }   
  433.     void remove(const T& value);   
  434.     void unique();   
  435.     void merge(list& x);   
  436.     void reverse();   
  437.     void sort();  
  438. #ifdef __STL_MEMBER_TEMPLATES template <class Predicate>   
  439.     void remove_if(Predicate);   
  440.     template <class BinaryPredicate> void unique(BinaryPredicate);   
  441.     template <class StrictWeakOrdering> void merge(list&, StrictWeakOrdering);  
  442.     template <class StrictWeakOrdering> void sort(StrictWeakOrdering);  
  443. #endif     /* __STL_MEMBER_TEMPLATES */   
  444.       
  445.     friend bool operator== __STL_NULL_TMPL_ARGS (const list& x, const list& y);  
  446. };  
  447.   
  448. // 判断两个链表是否相等  
  449. template <class T, class Alloc>  
  450. inline bool operator==(const list<T,Alloc>& x, const list<T,Alloc>& y)  
  451. {   
  452.     typedef typename list<T,Alloc>::link_type link_type;   
  453.     link_type e1 = x.node;   
  454.     link_type e2 = y.node;   
  455.     link_type n1 = (link_type) e1->next;   
  456.     link_type n2 = (link_type) e2->next;   
  457.     for ( ; n1 != e1 && n2 != e2 ;   
  458.                n1 = (link_type) n1->next, n2 = (link_type) n2->next)   
  459.         if (n1->data != n2->data)   
  460.             return false;   
  461.     return n1 == e1 && n2 == e2;  
  462. }  
  463.   
  464. // 链表比较大小使用的是字典顺序  
  465. template <class T, class Alloc>  
  466. inline bool operator<(const list<T, Alloc>& x, const list<T, Alloc>& y)  
  467. {   
  468.     return lexicographical_compare(x.begin(), x.end(), y.begin(), y.end());  
  469. }  
  470.   
  471. // 如果编译器支持模板函数特化优先级  
  472. // 那么将全局的swap实现为使用list私有的swap以提高效率  
  473. #ifdef __STL_FUNCTION_TMPL_PARTIAL_ORDER  
  474.   
  475. template <class T, class Alloc>  
  476. inline void swap(list<T, Alloc>& x, list<T, Alloc>& y){  
  477.     x.swap(y);  
  478. }#endif /* __STL_FUNCTION_TMPL_PARTIAL_ORDER */  
  479.   
  480. // 将[first, last)区间插入到position之前  
  481. #ifdef __STL_MEMBER_TEMPLATES  
  482. template <class T, class Alloc> template <class InputIterator>  
  483. void list<T, Alloc>::insert(iterator position,   
  484.                              InputIterator first, InputIterator last)  
  485. {   
  486.     for ( ; first != last; ++first)   
  487.         insert(position, *first);  
  488. }#else  /* __STL_MEMBER_TEMPLATES */  
  489.   
  490. template <class T, class Alloc>  
  491. void list<T, Alloc>::insert(iterator position, const T* first, const T* last)   
  492. {   
  493.     for ( ; first != last; ++first)   
  494.         insert(position, *first);  
  495. }  
  496.   
  497. template <class T, class Alloc>  
  498. void list<T, Alloc>::insert(iterator position,   
  499.                           const_iterator first, const_iterator last)   
  500. {   
  501.     for ( ; first != last; ++first)   
  502.         insert(position, *first);  
  503. }  
  504. #endif /* __STL_MEMBER_TEMPLATES */  
  505.   
  506. // 在position前插入n个值为x的元素  
  507. template <class T, class Alloc>  
  508. void list<T, Alloc>::insert(iterator position, size_type n, const T& x)  
  509. {   
  510.     for ( ; n > 0; --n)   
  511.         insert(position, x);  
  512. }  
  513.   
  514. // 擦除[first, last)间的结点  
  515. template <class T, class Alloc>  
  516. list<T,Alloc>::iterator list<T, Alloc>::erase(iterator first, iterator last)  
  517. {   
  518.     while (first != last)   
  519.         erase(first++); return last;  
  520. }  
  521.   
  522. // 重新设置容量大小  
  523. // 如果当前容量小于新容量, 则新增加值为x的元素, 使容量增加至新指定大小  
  524. // 如果当前容量大于新容量, 则析构出来的元素  
  525. template <class T, class Alloc>  
  526. void list<T, Alloc>::resize(size_type new_size, const T& x)  
  527. {  
  528.     iterator i = begin();   
  529.     size_type len = 0;   
  530.     for ( ; i != end() && len < new_size; ++i, ++len)   
  531.         ;   
  532.     if (len == new_size)   
  533.         erase(i, end());   
  534.     else // i == end()   
  535.         insert(end(), new_size - len, x);}  
  536.   
  537. // 销毁所有结点, 将链表置空  
  538. template <class T, class Alloc>  
  539. void list<T, Alloc>::clear()  
  540. {   
  541.     link_type cur = (link_type) node->next;  
  542.     while (cur != node) {     //遍历每个节点   
  543.         link_type tmp = cur;   
  544.         cur = (link_type) cur->next;   
  545.         destroy_node(tmp); //销毁(析构并释放)   
  546.     }  
  547.     //恢复node初始状态  
  548.     node->next = node;   
  549.     node->prev = node;  
  550. }  
  551.   
  552. // 链表赋值操作  
  553. // 如果当前容器元素少于x容器, 则析构多余元素,  
  554. // 否则将调用insert插入x中剩余的元素  
  555. template <class T, class Alloc>  
  556. list<T, Alloc>& list<T, Alloc>::operator=(const list<T, Alloc>& x)  
  557. {   
  558.     if (this != &x) {   
  559.         iterator first1 = begin();   
  560.         iterator last1 = end();   
  561.         const_iterator first2 = x.begin();   
  562.         const_iterator last2 = x.end();   
  563.         while (first1 != last1 && first2 != last2)   
  564.             *first1++ = *first2++;   
  565.         if (first2 == last2)   
  566.             erase(first1, last1);   
  567.         else insert(last1, first2, last2);   
  568.     }  
  569.     return *this;  
  570. }  
  571.   
  572. // 移除特定值的所有结点  
  573. // 时间复杂度O(n)  
  574. template <class T, class Alloc>  
  575. void list<T, Alloc>::remove(const T& value)  
  576. {  
  577.     iterator first = begin();   
  578.     iterator last = end();   
  579.     while (first != last) {   
  580.         iterator next = first;   
  581.         ++next;   
  582.         if (*first == value) erase(first); //找到元素将其删除   
  583.         first = next;  
  584.     }  
  585. }  
  586.   
  587. // 移除容器内所有的相邻的重复结点,“连续且相同”的元素才移除  
  588. // 时间复杂度O(n)  
  589. // 用户自定义数据类型需要提供operator ==()重载  
  590. template <class T, class Alloc>  
  591. void list<T, Alloc>::unique()  
  592. {   
  593.     iterator first = begin();   
  594.     iterator last = end();   
  595.     if (first == last) return//空链表,什么都不做   
  596.     iterator next = first;   
  597.     while (++next != last) {   
  598.         //遍历每个节点   
  599.         if (*first == *next)   
  600.             erase(next);   
  601.         else   
  602.             first = next;   
  603.         next = first;   
  604.     }  
  605. }  
  606.   
  607. // 假设当前容器和x都已序, 保证两容器合并后仍然有序  
  608. template <class T, class Alloc>  
  609. void list<T, Alloc>::merge(list<T, Alloc>& x)  
  610. {   
  611.     iterator first1 = begin();   
  612.     iterator last1 = end();   
  613.     iterator first2 = x.begin();   
  614.     iterator last2 = x.end();  
  615.     while (first1 != last1 && first2 != last2)   
  616.         if (*first2 < *first1) {   
  617.             iterator next = first2;   
  618.             transfer(first1, first2, ++next);   
  619.             first2 = next;  
  620.         }  
  621.         else   
  622.             ++first1;   
  623.     if (first2 != last2)   
  624.         transfer(last1, first2, last2);}  
  625. // 将链表倒置  
  626. // 其算法核心是历遍链表, 每次取出一个结点, 并插入到链表起始点  
  627. // 历遍完成后链表满足倒置  
  628. template <class T, class Alloc>  
  629. void list<T, Alloc>::reverse()  
  630. {   
  631.     if (node->next == node || link_type(node->next)->next == node) return;   
  632.     iterator first = begin();   
  633.     ++first;   
  634.     while (first != end()) {   
  635.         iterator old = first;   
  636.         ++first;   
  637.         transfer(begin(), old, first);  
  638.     }  
  639. }  
  640.   
  641. // 按照升序排序  
  642. template <class T, class Alloc>  
  643. void list<T, Alloc>::sort()  
  644. {   
  645.     if (node->next == node || link_type(node->next)->next == node) return;   
  646.     list<T, Alloc> carry;   
  647.     list<T, Alloc> counter[64];   
  648.     int fill = 0;   
  649.     while (!empty()) {  
  650.         carry.splice(carry.begin(), *this, begin());  
  651.         int i = 0;   
  652.         while(i < fill && !counter[i].empty()) {  
  653.             counter[i].merge(carry); carry.swap(counter[i++]);  
  654.         } carry.swap(counter[i]);  
  655.         if (i == fill)  
  656.             ++fill;   
  657.     }   
  658.     for (int i = 1; i < fill; ++i)   
  659.         counter[i].merge(counter[i-1]);  
  660.     swap(counter[fill-1]);  
  661. }  
  662.   
  663. #ifdef __STL_MEMBER_TEMPLATES  
  664.       
  665. // 给定一个仿函数, 如果仿函数值为真则进行相应元素的移除  
  666. template <class T, class Alloc>   
  667. template <class Predicate>void list<T, Alloc>::remove_if(Predicate pred)  
  668. {   
  669.     iterator first = begin();   
  670.     iterator last = end();  
  671.     while (first != last) {   
  672.         iterator next = first;   
  673.         ++next;   
  674.         if (pred(*first))  
  675.             erase(first);   
  676.         first = next;   
  677.     }  
  678. }  
  679.   
  680. // 根据仿函数, 决定如何移除相邻的重复结点  
  681. template <class T, class Alloc>   
  682. template <class BinaryPredicate>  
  683. void list<T, Alloc>::unique(BinaryPredicate binary_pred){   
  684.     iterator first = begin();   
  685.     iterator last = end();   
  686.     if (first == last) return;  
  687.     iterator next = first;   
  688.     while (++next != last) {   
  689.         if (binary_pred(*first, *next))   
  690.             erase(next);   
  691.         else   
  692.             first = next;   
  693.         next = first;   
  694.     }  
  695. }  
  696.   
  697. // 假设当前容器和x均已序, 将x合并到当前容器中, 并保证在comp仿函数  
  698. // 判定下仍然有序  
  699. template <class T, class Alloc> template <class StrictWeakOrdering>  
  700. void list<T, Alloc>::merge(list<T, Alloc>& x, StrictWeakOrdering comp)  
  701. {  
  702.     iterator first1 = begin();   
  703.     iterator last1 = end();  
  704.     iterator first2 = x.begin();   
  705.     iterator last2 = x.end();   
  706.     while (first1 != last1 && first2 != last2)  
  707.         if (comp(*first2, *first1)) {   
  708.             iterator next = first2;  
  709.             transfer(first1, first2, ++next);   
  710.             first2 = next; }   
  711.         else   
  712.             ++first1;   
  713.     if (first2 != last2)   
  714.         transfer(last1, first2, last2);  
  715. }  
  716.   
  717. // 根据仿函数comp据定如何排序  
  718. template <class T, class Alloc> template <class StrictWeakOrdering>  
  719. void list<T, Alloc>::sort(StrictWeakOrdering comp)  
  720. {   
  721.     if (node->next == node || link_type(node->next)->next == node)   
  722.         return;   
  723.     list<T, Alloc> carry;   
  724.     list<T, Alloc> counter[64];   
  725.     int fill = 0;  
  726.     while (!empty()) {   
  727.         carry.splice(carry.begin(), *this, begin());   
  728.         int i = 0;   
  729.         while(i < fill && !counter[i].empty()) {   
  730.             counter[i].merge(carry, comp);   
  731.             carry.swap(counter[i++]);   
  732.         }  
  733.         carry.swap(counter[i]);   
  734.         if (i == fill)   
  735.             ++fill;   
  736.     }   
  737.       
  738.     for (int i = 1; i < fill; ++i)   
  739.         counter[i].merge(counter[i-1], comp);  
  740.     swap(counter[fill-1]);  
  741. }  
  742. #endif /* __STL_MEMBER_TEMPLATES */  
  743.   
  744. #if defined(__sgi) && !defined(__GNUC__) && (_MIPS_SIM != _MIPS_SIM_ABI32)  
  745. #pragma reset woff 1174  
  746. #endif__STL_END_NAMESPACE  
  747. #endif /* __SGI_STL_INTERNAL_LIST_H */  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值