zoukankan      html  css  js  c++  java
  • [STL]list基础(转)

    各个容器有很多的相似性。先学好一个,其它的就好办了。先从基础开始。

    先看看他们的分类吧

    • 标准STL序列容器:vector、string、deque和list。
    • 标准STL关联容器:set、multiset、map和multimap。
    • 非标准序列容器slist和rope。slist是一个单向链表,rope本质上是一个重型字符串。
    • 非标准关联容器hash_set、hash_multiset、hash_map和hash_multimap。
      (各容器成员对比见:【STL】各容器成员对比表

      先看看list。

      list

      STL中的list就是一双向链表,可高效地进行插入删除元素。

      list不支持随机访问。所以没有 at(pos)和operator[]。

      list对象list1, list2分别有元素list1(1,2,3),list2(4,5,6)。list<int>::iterator it;

      list成员

      说明

      constructor

      构造函数

      destructor

      析构函数

      operator=

      赋值重载运算符

      assign

      分配值

      front

      返回第一个元素的引用

      back

      返回最后一元素的引用

      begin

      返回第一个元素的指针(iterator)

      end

      返回最后一个元素的下一位置的指针

      rbegin

      返回链表最后一元素的后向指针(reverse_iterator or const)

      rend

      返回链表第一元素的下一位置的后向指针

      push_back

      增加一元素到链表尾

      push_front

      增加一元素到链表头

      pop_back

      pop_back()删除链表尾的一个元素

      pop_front

      删除链表头的一元素

      clear

      删除所有元素

      erase

      删除一个元素或一个区域的元素(两个重载)

      remove 

      删除链表中匹配值的元素(匹配元素全部删除)

      remove_if

      删除条件满足的元素(遍历一次链表),参数为自定义的回调函数

      empty

      判断是否链表为空

      max_size

      返回链表最大可能长度

      size

      返回链表中元素个数

      resize

      重新定义链表长度(两重载函数)

      reverse

      反转链表

      sort 

      对链表排序,默认升序

      merge

      合并两个有序链表并使之有序

      splice 

      对两个链表进行结合(三个重载函数) 结合后第二个链表清空

      insert

      在指定位置插入一个或多个元素(三个重载函数)

      swap

      交换两个链表(两个重载)

      unique 

      删除相邻重复元素 

      1.list构造函数

      list<int> L0;       // 空链表

      list<int> L1(9);   // 建一个含个默认值是的元素的链表

      list<int> L2(5,1); // 建一个含个元素的链表,值都是

      list<int> L3(L2);  // 建一个L2的copy链表

      list<int> L4(L0.begin(), L0.end());//建一个含L0一个区域的元素

      2. assign()分配值,有两个重载

      L1.assign(4,3);                                // L1(3,3,3,3)

      L1.assign(++list1.beging(), list2.end());   // L1(2,3)

      3.operator= 赋值重载运算符

      L1 = list1;   // L1(1,2,3)

      1. 4.   front()返回第一个元素的引用

      int nRet = list1.front()    // nRet = 1

      5.  back()返回最后一元素的引用

      int nRet = list1.back()     // nRet = 3

      6.  begin()返回第一个元素的指针(iterator)

      it = list1.begin();    // *it = 1

      7.   end()返回最后一个元素的下一位置的指针(list为空时end()=begin())

      it = list1.end();

      --it;                       // *it = 3

      8.rbegin()返回链表最后一元素的后向指针(reverse_iterator or const)

      list<int>::reverse_iterator it = list1.rbegin();  // *it = 3

      9.   rend()返回链表第一元素的下一位置的后向指针

      list<int>::reverse_iterator it = list1.rend(); // *(--riter) = 1

      10.push_back()增加一元素到链表尾

      list1.push_back(4)       // list1(1,2,3,4)

      11. push_front()增加一元素到链表头

      list1.push_front(4)      // list1(4,1,2,3)

      12. pop_back()删除链表尾的一个元素

      list1.pop_back()          // list1(1,2)

      13.pop_front()删除链表头的一元素

      list1.pop_front()          // list1(2,3)

      14.clear()删除所有元素

      list1.clear();   // list1空了,list1.size() =0

      15.erase()删除一个元素一个区域的元素(两个重载函数)

      list1.erase(list1.begin());                // list1(2,3)

      list1.erase(++list1.begin(),list1.end()); // list1(1)

      16.    remove()删除链表中匹配值的元素(匹配元素全部删除)

      list对象L1(4,3,5,1,4)

      L1.remove(4);               // L1(3,5,1);

      17.remove_if()删除条件满足的元素(遍历一次链表),参数为自定义的回调函数

      // 小于2的值删除

      bool myFun(const int& value) { return (value < 2); }

      list1.remove_if(myFun);    // list1(3) 

      18.empty()判断是否链表为空

      bool bRet = L1.empty(); //若L1为空,bRet = true,否则bRet = false。

      19.max_size()返回链表最大可能长度

      list<int>::size_type nMax = list1.max_size();// nMax = 1073741823

      20.size()返回链表中元素个数

      list<int>::size_type nRet = list1.size();      // nRet = 3

      21.resize()重新定义链表长度(两重载函数)

      list1.resize(5)    // list1 (1,2,3,0,0)用默认值填补

      list1.resize(5,4)    // list1 (1,2,3,4,4)用指定值填补

      22.reverse()反转链表:

      list1.reverse();     // list1(3,2,1)

      23.sort()对链表排序,默认升序(可自定义回调函数)

      list对象L1(4,3,5,1,4)

       

      L1.sort();                 // L1(1,3,4,4,5)

      L1.sort(greater<int>()); // L1(5,4,4,3,1)

      24.merge()合并两个有序链表并使之有序

      // 升序

      list1.merge(list2);          // list1(1,2,3,4,5,6) list2现为空

      // 降序

      L1(3,2,1), L2(6,5,4)

      L1.merge(L2, greater<int>()); // list1(6,5,4,3,2,1) list2现为空

      25.splice()对两个链表进行结合(三个重载函数) 结合后第二个链表清空

      list1.splice(++list1.begin(),list2); 

      // list1(1,4,5,6,2,3) list2为空

       list1.splice(++list1.begin(),list2,list2.begin());

      // list1(1,4,2,3); list2(5,6)

      list1.splice(++list1.begin(),list2,++list2.begin(),list2.end());

      //list1(1,5,6,2,3); list2(4)

      26.insert()在指定位置插入一个或多个元素(三个重载函数)

      list1.insert(++list1.begin(),9);  // list1(1,9,2,3)

      list1.insert(list1.begin(),2,9);  // list1(9,9,1,2,3);

      list1.insert(list1.begin(),list2.begin(),--list2.end());//list1(4,5,1,2,3);

      27.swap()交换两个链表(两个重载)

      list1.swap(list2);   // list1(4,5,6) list2(1,2,3)

      28. unique()删除相邻重复元素

      L1(1,1,4,3,5,1)

      L1.unique();         // L1(1,4,3,5,1)

      bool same_integral_part (double first, double second)

      { return ( int(first)==int(second) ); }

      L1.unique(same_integral_part);

      例子:

        1 // ------------------------------------------------------------------------- 
        2 //    文件名        :     list1.cpp
        3 //    创建者        :    方煜宽
        4 //   邮箱        :  fangyukuan@gmail.com
        5 //    创建时间    :    2010-9-19 15:58
        6 //    功能描述    :    STL中的list就是一双向链表,可高效地进行插入删除元素。
        7 //                
        8 // -------------------------------------------------------------------------
        9 #include "stdafx.h"
       10 #include <iostream>
       11 #include <list>
       12 using namespace std;
       13 
       14 list<int> g_list1;
       15 list<int> g_list2;
       16 
       17 //////////////////////////////////////////////////////////////////////////
       18 
       19 // 初始化全局链表
       20 void InitList()
       21 {
       22     //  push_back()增加一元素到链表尾
       23     g_list1.push_back(1);
       24     g_list1.push_back(2);
       25     g_list1.push_back(3);
       26 
       27     // push_front()增加一元素到链表头
       28     g_list2.push_front(6);
       29     g_list2.push_front(5);
       30     g_list2.push_front(4);
       31 }
       32 
       33 // 输出一个链表
       34 void ShowList(list<int>& listTemp)
       35 {
       36     //  size()返回链表中元素个数
       37     cout << listTemp.size() << endl;
       38 
       39     for (list<int>::iterator it = listTemp.begin(); it != listTemp.end(); ++it)
       40     {
       41         cout << *it << ' ';
       42     }
       43     cout << endl;
       44 }
       45 
       46 //////////////////////////////////////////////////////////////////////////
       47 
       48 // 构造函数,空链表
       49 void constructor_test0()
       50 {
       51     list<int> listTemp;
       52     cout << listTemp.size() << endl;
       53 }
       54 
       55 // 构造函数,建一个含三个默认值是0的元素的链表
       56 void constructor_test1()
       57 {
       58     list<int> listTemp(3);
       59     ShowList(listTemp);
       60 }
       61 
       62 // 构造函数,建一个含五个元素的链表,值都是1
       63 void constructor_test2()
       64 {
       65     list<int> listTemp(5, 1);
       66     ShowList(listTemp);
       67 }
       68 
       69 // 构造函数,建一个g_list1的copy链表
       70 void constructor_test3()
       71 {
       72     list<int> listTemp(g_list1);
       73     ShowList(listTemp);
       74 }
       75 
       76 // 构造函数,listTemp含g_list1一个区域的元素[_First, _Last)
       77 void constructor_test4()
       78 {
       79     list<int> listTemp(g_list1.begin(), g_list1.end());
       80     ShowList(listTemp);
       81 }
       82 
       83 // assign()分配值,有两个重载
       84 // template <class InputIterator>
       85 // void assign ( InputIterator first, InputIterator last );
       86 // void assign ( size_type n, const T& u );
       87 void assign_test()
       88 {
       89     list<int> listTemp(5, 1);
       90     ShowList(listTemp);
       91 
       92     listTemp.assign(4, 3);
       93     ShowList(listTemp);
       94 
       95     listTemp.assign(++g_list1.begin(), g_list1.end());
       96     ShowList(listTemp);
       97 }
       98 
       99 // operator=
      100 void operator_equality_test()
      101 {
      102     g_list1 = g_list2;
      103     ShowList(g_list1);
      104     ShowList(g_list2);
      105 }
      106 
      107 // front()返回第一个元素的引用
      108 void front_test7()
      109 {
      110     cout << g_list1.front() << endl;
      111 }
      112 
      113 // back()返回最后一元素的引用
      114 void back_test()
      115 {
      116     cout << g_list1.back() << endl;
      117 }
      118 
      119 // begin()返回第一个元素的指针(iterator)
      120 void begin_test()
      121 {
      122     list<int>::iterator it1 = g_list1.begin();
      123     cout << *++it1 << endl;
      124 
      125     list<int>::const_iterator it2 = g_list1.begin();
      126     it2++;
      127     // (*it2)++;    //     *it2 为const 不用修改
      128     cout << *it2 << endl;    
      129 
      130 }
      131 
      132 // end()返回 [最后一个元素的下一位置的指针] (list为空时end()= begin())
      133 void end_test()
      134 {
      135     list<int>::iterator it  = g_list1.end();    // 注意是:最后一个元素的下一位置的指针
      136     --it;
      137     cout << *it << endl;
      138 }
      139 
      140 //  rbegin()返回链表最后一元素的后向指针
      141 void rbegin_test()
      142 {
      143     list<int>::reverse_iterator it = g_list1.rbegin();
      144     for (; it != g_list1.rend(); ++it)
      145     {
      146         cout << *it << ' ';
      147     }
      148     cout << endl;
      149 }
      150 
      151 //  rend()返回链表第一元素的下一位置的后向指针
      152 void rend_test()
      153 {
      154     list<int>::reverse_iterator it = g_list1.rend();
      155     --it;
      156     cout << *it << endl;
      157 }
      158 
      159 // push_back()增加一元素到链表尾
      160 void push_back_test()
      161 {
      162     ShowList(g_list1);
      163     g_list1.push_back(4);
      164     ShowList(g_list1);
      165 }
      166 
      167 // push_front()增加一元素到链表头 
      168 void push_front_test()
      169 {
      170     ShowList(g_list1);
      171     g_list1.push_front(4);
      172     ShowList(g_list1);
      173 }
      174 
      175 // pop_back()删除链表尾的一个元素
      176 void pop_back_test()
      177 {
      178     ShowList(g_list1);
      179     cout << endl;
      180 
      181     g_list1.pop_back();
      182     ShowList(g_list1);
      183 
      184 }
      185 
      186 // pop_front()删除链表头的一元素
      187 void pop_front_test()
      188 {
      189     ShowList(g_list1);
      190     cout << endl;
      191 
      192     g_list1.pop_front();
      193     ShowList(g_list1);
      194 }
      195 
      196 // clear()删除所有元素
      197 void clear_test()
      198 {
      199     ShowList(g_list1);
      200     g_list1.clear();
      201     ShowList(g_list1);
      202 }
      203 
      204 // erase()删除一个元素或一个区域的元素(两个重载函数)
      205 void erase_test()
      206 {
      207     ShowList(g_list1);
      208     g_list1.erase(g_list1.begin());
      209     ShowList(g_list1);
      210 
      211     cout << endl;
      212 
      213     ShowList(g_list2);
      214     g_list2.erase(++g_list2.begin(), g_list2.end());
      215     ShowList(g_list2);
      216 }
      217 
      218 // remove()删除链表中匹配值的元素(匹配元素全部删除)
      219 void remove_test()
      220 {
      221     ShowList(g_list1);
      222     g_list1.push_back(1);
      223     ShowList(g_list1);
      224 
      225     g_list1.remove(1);
      226     ShowList(g_list1);
      227 }
      228 
      229 bool myFun(const int& value) { return (value < 2); }
      230 // remove_if()删除条件满足的元素(会遍历一次链表)
      231 void remove_if_test()
      232 {
      233     ShowList(g_list1);
      234     g_list1.remove_if(myFun);
      235     ShowList(g_list1);
      236 }
      237 
      238 
      239 // empty()判断是否链表为空
      240 void empty_test()
      241 {
      242     list<int> listTemp;
      243     if (listTemp.empty())
      244         cout << "listTemp为空" << endl;
      245     else
      246         cout << "listTemp不为空" << endl;
      247 }
      248 
      249 
      250 //  max_size()返回链表最大可能长度:1073741823
      251 void max_size_test()
      252 {
      253     list<int>::size_type nMax = g_list1.max_size();
      254     cout << nMax << endl;
      255 }
      256 
      257 
      258 // resize()重新定义链表长度(两重载函数):
      259 void resize_test()
      260 {
      261     ShowList(g_list1);
      262     g_list1.resize(9);        // 用默认值填补
      263     ShowList(g_list1);
      264     cout << endl;
      265 
      266     ShowList(g_list2);
      267     g_list2.resize(9, 51);    // 用指定值填补
      268     ShowList(g_list2);
      269 }
      270 
      271 // reverse()反转链表
      272 void reverse_test()
      273 {
      274     ShowList(g_list1);
      275     g_list1.reverse();
      276     ShowList(g_list1);
      277 }
      278 
      279 
      280 // sort()对链表排序,默认升序(两个重载函数)
      281 void sort_test()
      282 {
      283     list<int> listTemp;
      284     listTemp.push_back(9);
      285     listTemp.push_back(3);
      286     listTemp.push_back(5);
      287     listTemp.push_back(1);
      288     listTemp.push_back(4);
      289     listTemp.push_back(3);
      290 
      291     ShowList(listTemp);
      292     listTemp.sort();
      293     ShowList(listTemp);
      294 
      295     listTemp.sort(greater<int>());
      296     ShowList(listTemp);
      297 }
      298 
      299 // merge()合并两个升序序链表并使之成为另一个升序.
      300 void merge_test1()
      301 {
      302     list<int> listTemp2;
      303     listTemp2.push_back(3);
      304     listTemp2.push_back(4);
      305 
      306     list<int> listTemp3;
      307     listTemp3.push_back(9);
      308     listTemp3.push_back(10);
      309 
      310     ShowList(listTemp2);
      311     cout << endl;
      312     ShowList(listTemp3);
      313     cout << endl;
      314 
      315     listTemp2.merge(listTemp3);
      316     ShowList(listTemp2);
      317 }
      318 
      319 
      320 bool myCmp (int first, int second)
      321 { return ( int(first)>int(second) ); }
      322 
      323 // merge()合并两个降序链表并使之成为另一个降序.
      324 void merge_test2()
      325 {
      326     list<int> listTemp2;
      327     listTemp2.push_back(4);
      328     listTemp2.push_back(3);
      329 
      330     list<int> listTemp3;
      331     listTemp3.push_back(10);
      332     listTemp3.push_back(9);
      333 
      334     ShowList(listTemp2);
      335     cout << endl;
      336     ShowList(listTemp3);
      337     cout << endl;
      338 
      339     // listTemp2.merge(listTemp3, greater<int>());    // 第二个参数可以是自己定义的函数如下
      340     listTemp2.merge(listTemp3, myCmp);
      341     ShowList(listTemp2);
      342 }
      343 
      344 // splice()对两个链表进行结合(三个重载函数),结合后第二个链表清空
      345 // void splice ( iterator position, list<T,Allocator>& x );
      346 // void splice ( iterator position, list<T,Allocator>& x, iterator i );
      347 // void splice ( iterator position, list<T,Allocator>& x, iterator first, iterator last );
      348 void splice_test()
      349 {
      350     list<int> listTemp1(g_list1);
      351     list<int> listTemp2(g_list2);
      352 
      353     ShowList(listTemp1);
      354     ShowList(listTemp2);
      355     cout << endl;
      356     
      357     // 
      358     listTemp1.splice(++listTemp1.begin(), listTemp2);
      359     ShowList(listTemp1);
      360     ShowList(listTemp2);
      361 
      362     // 
      363     listTemp1.assign(g_list1.begin(), g_list1.end());
      364     listTemp2.assign(g_list2.begin(), g_list2.end());
      365     listTemp1.splice(++listTemp1.begin(), listTemp2, ++listTemp2.begin());
      366     ShowList(listTemp1);
      367     ShowList(listTemp2);
      368 
      369     // 
      370     listTemp1.assign(g_list1.begin(), g_list1.end());
      371     listTemp2.assign(g_list2.begin(), g_list2.end());
      372     listTemp1.splice(++listTemp1.begin(), listTemp2, ++listTemp2.begin(), listTemp2.end());
      373     ShowList(listTemp1);
      374     ShowList(listTemp2);
      375 
      376 }
      377 
      378 //  insert()在指定位置插入一个或多个元素(三个重载函数)
      379 // iterator insert ( iterator position, const T& x );
      380 // void insert ( iterator position, size_type n, const T& x );
      381 // template <class InputIterator>
      382 // void insert ( iterator position, InputIterator first, InputIterator last );
      383 void insert_test()
      384 {
      385     list<int> listTemp1(g_list1);
      386     ShowList(listTemp1);
      387     listTemp1.insert(listTemp1.begin(), 51);
      388     ShowList(listTemp1);
      389     cout << endl;
      390 
      391     list<int> listTemp2(g_list1);
      392     ShowList(listTemp2);
      393     listTemp2.insert(listTemp2.begin(), 9, 51);
      394     ShowList(listTemp2);
      395     cout << endl;
      396 
      397     list<int> listTemp3(g_list1);
      398     ShowList(listTemp3);
      399     listTemp3.insert(listTemp3.begin(), g_list2.begin(), g_list2.end());
      400     ShowList(listTemp3);
      401 
      402 }
      403 
      404 // swap()交换两个链表(两个重载)
      405 void swap_test()
      406 {
      407     ShowList(g_list1);
      408     ShowList(g_list2);
      409     cout << endl;
      410 
      411     g_list1.swap(g_list2);
      412     ShowList(g_list1);
      413     ShowList(g_list2);
      414 }
      415 
      416 bool same_integral_part (double first, double second)
      417 { return ( int(first)==int(second) ); }
      418 
      419 // unique()删除相邻重复元素
      420 void unique_test()
      421 {
      422     list<int> listTemp;
      423     listTemp.push_back(1);
      424     listTemp.push_back(1);
      425     listTemp.push_back(4);
      426     listTemp.push_back(3);
      427     listTemp.push_back(5);
      428     listTemp.push_back(1);
      429     list<int> listTemp2(listTemp);
      430     
      431     ShowList(listTemp);
      432     listTemp.unique();    // 不会删除不相邻的相同元素
      433     ShowList(listTemp);
      434     cout << endl;
      435 
      436     listTemp.sort();
      437     ShowList(listTemp);
      438     listTemp.unique();
      439     ShowList(listTemp);
      440     cout << endl;
      441 
      442     listTemp2.sort();
      443     ShowList(listTemp2);
      444     listTemp2.unique(same_integral_part);
      445     ShowList(listTemp2);
      446 
      447 }
      448 
      449 // 主函数,下面要测试哪个就把那个注释去掉即可
      450 int _tmain(int argc, _TCHAR* argv[])
      451 {
      452     InitList();
      453 //     ShowList(g_list1);
      454 //     ShowList(g_list2);
      455 
      456 //     constructor_test0();
      457 //     constructor_test1();
      458 //     constructor_test2();
      459 //     constructor_test3();
      460 //     constructor_test4();
      461 //     assign_test();
      462 //     operator_equality_test();
      463 //     front_test7();
      464 //     back_test();
      465 //     begin_test();
      466 //     end_test();
      467 //     rbegin_test();
      468 //     rend_test();
      469 //     push_back_test();
      470 //     push_front_test();
      471 //     pop_back_test();
      472 //     pop_front_test();
      473 //     clear_test();
      474 //     erase_test();
      475 //      remove_test();
      476 //     remove_if_test();
      477 //     empty_test();
      478 //     max_size_test();
      479 //     resize_test();
      480 //     reverse_test();
      481 //     sort_test();
      482 //     merge_test1();
      483 //     merge_test2();
      484 //     splice_test();
      485 //     insert_test();
      486 //     swap_test();
      487 //     unique_test();
      488     return 0;
      489 }

      转自:http://www.cnblogs.com/fangyukuan/archive/2010/09/21/1832364.html

  • 相关阅读:
    python——ddt + excel + HTMLTestRunner 实现接口测试
    APP模拟弱网环境测试教程
    静态语言与动态语言
    Charles手机抓包实用教程
    DS博客作业08--课程总结
    DS博客作业03--栈和队列
    DS博客作业02--线性表
    DS博客作业01--日期抽象数据类型设计与实现
    第四次作业
    C博客作业01--分支、顺序结构
  • 原文地址:https://www.cnblogs.com/crazyapple/p/2650582.html
Copyright © 2011-2022 走看看