C++STL基础

什么是STL

STL就是Standard Template Library,标准模板库。STL是泛型编程的实例,用到的技术就是类模板和函数模板。STL的一个重要特点是数据结构和算法的分离。

模板:所谓模板是一种使用无类型参数来产生一系列函数或类的机制。通过模板可以产生类或函数的集合,使它们操作不同的数据类型,从而避免需要为每一种数据类型产生一个独立的类或函数。 

STL简介

STL的代码从广义上讲分为3类:algorithm(算法)、container(容器)和iterator(迭代器)。几乎所有的代码都采用了模板类和模板函数的方式,这相比于传统的由函数和类组成的库来说提供了更好的代码重用几乎。在C++标准中,STL由13个头文件组成,如<list>

STL的代码从广义上讲分为三类(共13个头文件)

算法(algorithm)  3个头文件

algorithm,numeric,functional

容器(container)  7个头文件

vector,list,deque,stack,set(set,multiset),map(map,multimap),queue(queue,priority_queue)   10个数据结构

迭代器(iterator)  3个头文件

iterator,memory,utility

算法

算法是用来操作容器中的数据的模版函数。例如,STL用sort()来对一个vector中的数据进行排序,用find()来搜索一个list中的对象。函数本身与他们操作的数据的结构和类型无关,因此他们可以从简单的数组到高度复杂容器的任何数据结构上使用。

算法部分主要由头文件<algorithm><numeric><functional>组成。<algorithm>是所有STL头文件中最大的一个(尽管它很好理解),它是由一大堆模版函数组成的,可以认为每个函数在很大程度上都是独立的,其中常用到的功能范围涉及到比较、交换、查找、遍历操作、复制、修改、移除、反转、排序、合并等等。<numeric>体积很小,只包括几个在序列上面进行简单数学运算的模板函数,包括加法和乘法在序列上的一些操作。<functional>中则定义了一些模板类,用以声明函数对象。

容器

容器是一种数据结构,如list,vector和deques,以模板类的方法提供。为了访问容器中的数据,可以使用容器类输出的迭代器。 

数据结构 描述 头文件
vector向量 连续存储元素 <vector>
list列表 由节点组成的双向链表,每个节点包含一个元素 <list>
deque双列表 连续存储的指向不同元素的指针所组成数组 <deque>
set集合

由节点组成的红黑树,每个节点都包含着一个元素,节点之间以某种作用于元素对的谓词排列,没有两个不同的元素能够拥有相同的次序

<set>
multiset多重集合

允许存在两个次序相等的元素的集合

<set>
stack栈

后进先出的值的排列

<stack>
queue队列

先进先出的执的排列

<queue>
priority_queue优先队列

元素的次序是由作用于所存储的值对上的某种谓词决定的的一种队列

<queue>
map映射

{键,值}对组成的集合,以某种作用于键对上的谓词排列

<map>
multimap多重映射

允许键对有相等的次序的映射

<map>

对应的数据结构:vector线性表,list双向链表,stack栈,queue队列,deque可以理解为vector和list的结合体,set红黑树,map平衡二叉树

 

容器分为三大类
顺序容器

vector:后部插入/删除,直接访问

deque:前/后部插入/删除,直接访问

list:双向链表,任意位置插入/删除

关联容器

set:快速查找,无重复元素

multiset:快速查找,可有重复元素

map:一对一映射,无重复元素,基于关键字查找

multimap:一对一映射,可有重复元素,基于关键之查找

容器适配器

stack:LIFO

queue:FIFO

priority_queue:优先级高的元素先出

 

迭代器

迭代器提供了访问容器中对象的方法。例如,可以使用一对迭代器指定list或vector中的一定范围的对象。迭代器就如同一个指针。事实上,C++的指针也是一种迭代器。但是,迭代器也可以是那些定义了operator*()以及其他类似于指针的操作符地方法的类对象。

软件设计有一个基本原则,所有的问题都可以通过引进一个间接层来简化,这种简化在STL中就是用迭代器来完成的。概括来说,迭代器在STL中用来将算法和容器联系起来,起着一种黏和剂的作用。几乎STL提供的所有算法都是通过迭代器存取元素序列进行工作的,每一个容器都定义了其本身所专有的迭代器,用以存取容器中的元素。

迭代器部分主要由头文件<utility>,<iterator><memory>组成。

<utility>是一个很小的头文件,它包括了贯穿使用在STL中的几个模板的声明,

<iterator>中提供了迭代器使用的许多方法,

而对于<memory>的描述则十分的困难,它以不同寻常的方式为容器中的元素分配存储空间,同时也为某些算法执行期间产生的临时对象提供机制,<memory>中的主要部分是模板类allocator,它负责产生所有容器中的默认分配器。

容器

同一种类型对象的集合。这些容器的共有成员函数:empty()判断容器中是否有元素,max_size()容器中最多能装多少元素,swap()交换两个容器的内容。

比较两个容器大小的运算符:=,<,<=,>,>=,==,!=

  • 1.若两容器长度相同、所有元素相等,则两个容器就相等,否则为不等。
  • 2.若两容器长度不同,但较短容器中所有元素都等于较长容器中对应的元素,则较短容器小于另一个容器。
  • 3.若两个容器均不是对方的子序列,则取决于所比较的第一个不等的元素)

线性表

在实际应用中,线性表都是以字符串string,数组array,栈stack,队列queue,优先队列priority_queue,向量vector,列表list,双向队列deque等特殊线性表的形式来使用的。根据存储方式可分为顺序表,链表;链表又分为单链表,双链表,循环链表。

顺序容器(vector,list,deque)

元素排列次序与元素值无关,而是由元素添加到容器里的顺序决定的。

  • 1.定义赋值,它们的定义赋值assign及用法完全相同。
  • 2.都有返回表头元素表尾元素front(),back(),对于双向链表list和双向队列deque来说也只有一个表头和一个表尾,这里的双向是对元素可以双向添加删除而言的。
  • 3.增加删除元素,都提供了在表尾增加删除元素方法push_back(),pop_back(),在任意位置增加删除元素方法insert(),erase(),全部删除元素clear()。
  • 4.返回iterator和reverse_iterator 返回指向表头元素的指针begin(),返回表尾元素下一个位置end(),返回指向表尾元素的指针rbegin(),返回表头元素前一个位置rend()。
  • 5.其他 获取长度size(),重置长度resize(),返回最大长度max_size(),两个容器互换swap(),判断是否为空empty()

vector

向量vector就是动态数组。顺序存储(说明可以用索引值,at()来进行元素访问,且其iterator可以+-n),连续存储元素。比list和deque多提供了获取容量capacity(),设置最小容量reserve()

list

列表list是一个双向链表。链式存储(不可以用索引值来进行访问,且其iterator不可以+-n),由节点组成的双向链表,每个节点包含着一个元素。由于是双向链表,所以比vector多提供了在表头增加删除函数push_front(),pop_front(),此外比vector和deque多提供了排序函数sort(),队列合并merge()(注意:合并前需要排序),接合函数splice(),去重函数unique(),删除元素函数remove(),remove_if()

deque

双向队列deque。顺序存储(说明可以用索引值,at()来进行元素访问,且其iterator可以+-n),连续存储指向不同元素的指针所组成的数组。由于是双向队列,所以比vector多提供了在表头增加删除函数push_front(),pop_front(),此外比vector少提供了逆序函数reverse()

选择容器类型的法则

如果程序要求随机访问元素,则应使用 vector 或 deque 容器。
如果程序必须在容器的中间位置插入或删除元素,则应采用 list 容器。
如果程序不是在容器的中间位置,而是在容器首部或尾部插入或删除元素,则应采用 deque 容器。
如果只需在读取输入时在容器的中间位置插入元素,然后需要随机访问元素,则可考虑在输入时将元素读入到一个 list 容器,接着对此容器重新排序,使其适合顺序访问,然后将排序后的 list 容器复制到一个 vector 容器。


关联容器,通过 键 存储和读取元素。顺序容器,通过元素在容器中的位置顺序存储和读取元素。
关联容器和顺序容器的本质差别在于:关联容器通过键(key)存储和读取元素,而顺序容器则通过元素在容器中的位置顺序存储和访问元素。 

map映射

map是标准关联式容器之一,一个map是一个键值对序列,即(key,value)对。它提供了基于key的快速检索能力,在一个map中key值是唯一的。map提供了双向迭代器,即从前往后的(iterator),也有从后往前的(reverse_iterator)。
map要求能对key进行操作,且保持按key值递增有序,因此map上的迭代器也是递增有序的。如果对于元素并不需要保持有序,可以使用hash_map。
map中key值是唯一的,如果map中已存在一个键值对(昵称,密码):("sky",789852),而我们还是想插入一个键值对("sky",789852)则会报错(不是报错,准确的说是,返回插入不成功!)。而我们有的确想这样做,即一个键对于多个值,幸运的是multimap可以实现这个功能。

小demo

   网上实例

[cpp] view plain copy print ?
  1. #include <string>  
  2. #include <map>    
  3. #include <conio.h>  
  4. #include<iostream>  
  5. using namespace std;     
  6. //定义及初始化;没有返回值,或void  
  7. void test0()  
  8. {    
  9.     map<int,string> first;  
  10.     first.insert(pair<int,string>(3,"hello"));  
  11.     map<int,string> second(first);//拷贝构造函数  
  12.     map<int,string> third(first.begin(),first.end());//区间构造函数  
  13. }  
  14. //增加删除元素;返回值是void,除erase()的返回值是iterator外  
  15. void test1()  
  16. {      
  17.     //first insert 用insert()函数插入pair数据  
  18.     map<char,int> myfirst;  
  19.     myfirst.insert(pair<char,int>('a',100));   
  20.     //second insert 用insert()函数插入value_type数据  
  21.     myfirst.insert(map<char,int>::value_type('f',50));   
  22.     //third insert 使用数组方式插入数据  
  23.     myfirst['w']=60;   
  24.     //fourth insert 在iterator位置上插入pair数据  
  25.     map<char,int>::iterator ite=myfirst.begin();  
  26.     myfirst.insert(ite,pair<char,int>('b',300));    
  27.        
  28.     cout<<"myfirst\n";  
  29.     for (map<char,int>::iterator iter=myfirst.begin();iter!=myfirst.end();iter++)  
  30.     {  
  31.         cout<<iter->first<<"=>"<<iter->second<<endl;  
  32.         //a=>100  
  33.         //b=>300  
  34.         //f=>50  
  35.         //w=>60  
  36.     }   
  37.     map<int,int>mymap;  
  38.     for (int i=0;i<3;i++)  
  39.     {  
  40.         mymap[i]=i*100;  
  41.     }   
  42.     for (map<int,int>::iterator iter=mymap.begin();iter!=mymap.end();iter++)  
  43.     {  
  44.         cout<<iter->first<<"=>"<<iter->second<<endl;  
  45.         //0=>0  
  46.         //1=>100  
  47.         //2=>200  
  48.     }  
  49.     mymap.clear();  
  50.     mymap[8]=20;  
  51.     mymap[5]=60;   
  52.     while(!mymap.empty())  
  53.     {  
  54.         cout<<mymap.begin()->first<<"=>"<<mymap.begin()->second<<endl;  
  55.         //5=>60  
  56.         //8=>20  
  57.         mymap.erase(mymap.begin());  
  58.     }  
  59.     map<char,int> first;  
  60.     map<char,int>::iterator it;  
  61.     first['a']=10;  
  62.     first['b']=20;  
  63.     first['c']=30;  
  64.     first['d']=40;  
  65.     first['e']=50;  
  66.     first['f']=60;  
  67.     first['g']=70;  
  68.     first['h']=80;  
  69.       
  70.     it=first.find('b');  
  71.     first.erase(it); //用迭代器删除  
  72.     first.erase('c');//用关键字删除  
  73.     it=first.find('e');  
  74.     first.erase(it,first.end());//成片删除  
  75.     cout<<"--------------erase-------------\n";  
  76.     for (it=first.begin();it!=first.end();it++)  
  77.     {  
  78.         cout<<it->first<<"=>"<<it->second<<endl;  
  79.         //a=>10  
  80.         //b=>40  
  81.     }     
  82. }  
  83. //访问获取元素;返回值是Type T  
  84. void test2()  
  85. {    
  86.     map<char,int> first;  
  87.     map<char,int>::iterator it;  
  88.     first['a']=10;  
  89.     first['b']=20;  
  90.     first['c']=30;  
  91.     first['d']=40;  
  92.     it=first.find('b');  
  93.     first.erase(it);  
  94.     first.erase(first.find('d'));  
  95.     cout<<"a=>"<<first.begin()->second<<endl;//a=>10  
  96.     cout<<"c=>"<<first.find('c')->second<<endl;//c=>30  
  97.     //cout<<"w=>"<<first.find('w')->second<<endl;//当关键字不存在时,运行出现错误  
  98.        
  99. }  
  100. //返回迭代器;返回值是iterator,或reverse_iterator  
  101. void test3()  
  102. {   
  103.     map<char,int> mymap;  
  104.     mymap['b']=100;  
  105.     mymap['a']=200;  
  106.     mymap['c']=500;  
  107.     map<char,int>::iterator iter=mymap.begin();  
  108.     for (;iter!=mymap.end();iter++)  
  109.     {  
  110.         cout<<iter->first<<"=>"<<iter->second<<endl;  
  111.         //a=>200  
  112.         //b=>100  
  113.         //c=>500  
  114.     }      
  115.     cout<<"----reverse_iterator----"<<endl;  
  116.     map<char,int>::reverse_iterator riter=mymap.rbegin();  
  117.     for (;riter!=mymap.rend();++riter)  
  118.     {   
  119.         cout<<riter->first<<"=>"<<riter->second<<endl;  
  120.         //c=>500  
  121.         //b=>100  
  122.         //a=>200  
  123.     }  
  124.       
  125. }   
  126. //其他  
  127. void test4()  
  128. {    
  129.     map<char,int>mymap,second;  
  130.     mymap['a']=101;  
  131.     mymap['b']=202;  
  132.     mymap['c']=303;  
  133.     mymap['d']=404;  
  134.     for (char c='a';c<'h';c++)  
  135.     {  
  136.         cout<<c;  
  137.         if (mymap.count(c)>0)  
  138.         {  
  139.             cout<<" is an element of mymap.\n";//a,b,c,d  
  140.         }  
  141.         else  
  142.             cout<<" is not an element of mymap.\n";//d,e,f,g        
  143.     }  
  144.     cout<<"mymap.size() is "<<mymap.size()<<endl;//3  
  145.   
  146.     second['x']=11;  
  147.     second['y']=22;  
  148.     second['z']=33;  
  149.     second.swap(mymap);  
  150.   
  151.     cout<<"mymap-----\n";  
  152.     for (map<char,int>::iterator it=mymap.begin();it!=mymap.end();it++)  
  153.     {  
  154.         cout<<it->first<<"=>"<<it->second<<endl;  
  155.         //x=>11  
  156.         //y=>22  
  157.         //z=>33  
  158.     }  
  159.     cout<<"second-----\n";  
  160.     for (map<char,int>::iterator it=second.begin();it!=second.end();it++)  
  161.     {  
  162.         cout<<it->first<<"=>"<<it->second<<endl;  
  163.         //a=>101  
  164.         //b=>202  
  165.         //c=>303  
  166.         //d=>404  
  167.     }  
  168.     //equal_range():返回pair(iterator,iterator),pair中的第一个迭代器是lower_bound()返回的迭代器,pair中的第二个迭代器是upper_bound()返回的迭代器,如果两个迭代器相等,则说明map中不存在这个关键字  
  169.     pair<map<char,int>::iterator,map<char,int>::iterator> ret=mymap.equal_range('y');  
  170.     cout<<"lower bound points to: "<<ret.first->first<<"=>"<<ret.first->second<<endl;//y=>22  
  171.     cout<<"upper bound points to: "<<ret.second->first<<"=>"<<ret.second->second<<endl;//z=>33  
  172.   
  173.     map<char,int>::iterator itlow,itup;  
  174.     //lower_bound():返回是iterator,返回要查找关键字的下界(是一个迭代器)  
  175.     //upper_bound():返回是iterator,返回要查找关键字的上界(是一个迭代器)  
  176.     itlow=second.lower_bound('b');//itlow points to b  
  177.     itup=second.upper_bound('c');//itup points to d (not c)  
  178.     second.erase(itlow,itup);//删除[itlow,itup)  
  179.     cout<<"itlow,itup\n";  
  180.     for (map<char,int>::iterator it=second.begin();it!=second.end();it++)  
  181.     {  
  182.         cout<<it->first<<"=>"<<it->second<<endl;   
  183.         //a=>101  
  184.         //d=>404  
  185.     }  
  186.     second['p']=505;  
  187.     map<char,int>::key_compare mycomp=second.key_comp();  
  188.     char highest=second.rbegin()->first;  
  189.     map<char,int>::iterator item=second.begin();  
  190.     cout<<"key_compare\n";  
  191.     do   
  192.     {  
  193.         cout<<item->first<<"=>"<<item->second<<endl;   
  194.     }while(mycomp((*item++).first,highest));  
  195.   
  196.     cout<<"value_compare\n";  
  197.     pair<char,int> high=*second.rbegin();  
  198.     map<char,int>::iterator io=second.begin();  
  199.     do   
  200.     {  
  201.         cout<<io->first<<"=>"<<io->second<<endl;   
  202.     } while (second.value_comp()(*io++,high));  
  203.       
  204. }   
  205. //遍历map中的数据  
  206. void test5()  
  207. {    
  208.     //1.使用前向迭代器  
  209.     //2.使用相反迭代器  
  210.     //3.使用数组(不完全正确,当数据插入时键值完全顺序才正确,不然会出现二叉树的输出结果)  
  211.     map<int,int> mymap;  
  212.     mymap[0]=100;  
  213.     mymap[3]=200;  
  214.     mymap[2]=500;  
  215.     map<int,int>::iterator iter=mymap.begin();  
  216.     for (;iter!=mymap.end();iter++)  
  217.     {  
  218.         cout<<iter->first<<"=>"<<iter->second<<endl;  
  219.         //0=>100  
  220.         //2=>500  
  221.         //3=>200  
  222.     }      
  223.     cout<<"----reverse_iterator----"<<endl;  
  224.     map<int,int>::reverse_iterator riter=mymap.rbegin();  
  225.     for (;riter!=mymap.rend();++riter)  
  226.     {   
  227.         cout<<riter->first<<"=>"<<riter->second<<endl;  
  228.         //3=>200  
  229.         //2=>500  
  230.         //0=>100  
  231.     }  
  232.     cout<<"mymap size:"<<mymap.size()<<endl;  
  233.     for (int i=0;i<mymap.size();i++)  
  234.     {  
  235.         cout<<mymap[i]<<endl;  
  236.         //100  
  237.         //0  
  238.         //500   
  239.         //200  
  240.         //map中由于他内部有序,由红黑树保证,因此很多函数执行的时间复杂度都是log2N  
  241.     }     
  242. }   
  243. void Test(char h)  
  244. {  
  245.     cout<<"press key===="<<h<<endl;  
  246.     switch(h)  
  247.     {   
  248.     case '0':  test0();break;  
  249.     case '1':  test1();break;  
  250.     case '2':  test2();break;  
  251.     case '3':  test3();break;  
  252.     case '4':  test4();break;  
  253.     case '5':  test5();break;   
  254.     case 27:  
  255.     case 'q':exit(0);break;   
  256.     default:cout<<"default "<<h<<endl;break;  
  257.     }  
  258. }  
  259. void main()  
  260. {  
  261.     while(1)  
  262.     {  
  263.         Test(getch());  
  264.     }   
  265. }  

 

map是一类关联容器。它的特点是增加和删除节点对迭代器的影响很小,除了那个操作节点,对其他节点都没有什么影响。因为它内部结构式红黑二叉树。对于迭代器来说可以修改实值value,而不能修改关键字key。map的功能如下:

  • 自动建立key-value的对应。key和value可以使任意你需要的类型。
  • 根据key值快速查找记录,查找的复杂度基本是log(N)
  • 快速插入key-value记录
  • 快速删除记录
  • 根据key修改value记录
  • 遍历所有记录

Vector 网上教程有实例的

vector的函数共有五大类:定义及初始化,增加删除元素,访问元素,返回迭代器,获取设置长度容器

 

[cpp] view plain copy print ?
  1. #include <string>  
  2. #include <vector>   
  3. #include <conio.h>  
  4. #include<iostream>  
  5. using namespace std;    
  6. //定义及初始化;返回void或无返回值  
  7. void test0()  
  8. {   
  9.     vector<int> v;//只定义了v,没有分配内存空间  
  10.     vector<int> ve(2);//定义并分配了2int空间的ve,缺省为0  
  11.     vector<int> vec(3,4);//定义并初始化了3个4的vec  
  12.     cout<<v.size()<<" "<<ve.size()<<" "<<vec.size()<<endl;//0 2 3  
  13.     cout<<"ve:"<<ve[0]<<" "<<ve[1]<<endl;//ve: 0 0  
  14.     cout<<"vec:"<<vec[0]<<" "<<vec[1]<<" "<<vec[2]<<endl;//vec: 4 4 4  
  15.     v.assign(3,8);//赋值3个8  
  16.     ve.assign(vec.begin(),vec.end());//赋值3个4  
  17.     for (int i=0;i<v.size();i++)   
  18.         cout<<v[i]<<" "//8 8 8   
  19.     cout<<endl;  
  20.     for (int i=0;i<ve.size();i++)   
  21.         cout<<ve[i]<<" ";//4 4 4   
  22.     cout<<endl;  
  23.     ve.assign(0,0);//赋值0个0,且可以看出它的内存是变化的.此为空  
  24.     for (int i=0;i<ve.size();i++)   
  25.         cout<<ve[i]<<" ";//为空   
  26.     cout<<endl;      
  27. }  
  28. //增加删除元素;返回void,处erase()返回iterator外  
  29. void test1()  
  30. {   
  31.     vector<char> v(2,'A');  
  32.     v.push_back('B');//在尾部加入一个数据  
  33.     cout<<v[0]<<" "<<v[1]<<' '<<v[2]<<endl;//A A B  
  34.     v.pop_back();//删除最后一个数据  
  35.     v.insert(v.begin()+1,'C');//在第二个位置上插入了'C'  
  36.     v.insert(v.begin(),2,'D'); //在第一个第二个位置上分别插入'C'  
  37.     v.insert(v.end(),v.begin(),v.end());//在其末端插入了其之前的所有元素,等于复制了  
  38.     for (int i=0;i<v.size();i++)   
  39.         cout<<v[i]<<" "//D D A C A D D A C A  
  40.     cout<<endl;  
  41.   
  42.     v.erase(v.begin());//删除第一个元素  
  43.     for (int i=0;i<v.size();i++)   
  44.         cout<<v[i]<<" "//D A C A D D A C A  
  45.     cout<<endl;  
  46.     v.erase(v.begin()+1,v.end()-1);//留下两端的元素,删除中间的元素  
  47.     for (int i=0;i<v.size();i++)   
  48.         cout<<v[i]<<" "//D A  
  49.     cout<<endl;  
  50.     v.clear();//删除全部  
  51.     for (int i=0;i<v.size();i++)   
  52.         cout<<v[i]<<" "//为空  
  53.     cout<<endl;  
  54. }  
  55. //访问获取元素;返回TYPE &T  
  56. void test2()  
  57. {   
  58.     string str[]={"one","two","three","four","five","six"};  
  59.     vector<string> ve;  
  60.     for(int i=0;i<6;i++)   
  61.     {  
  62.         ve.push_back(str[i]);   
  63.         cout<<ve[i]<<" ";//通过索引值i来进行访问,使用的是数组的形式,当然不能越界  
  64.     }  
  65.     cout<<endl;  
  66.     for(int i=0;i<6;i++)   
  67.     {   
  68.         cout<<ve.at(i)<<" ";//使用at()通过i来进行访问,也不能越界。若越界,在调试时,会抛出异常;在运行时直接弹出错误  
  69.     }  
  70.     cout<<endl;  
  71.     cout<<ve.front()<<endl;//one //返回第一个元素的引用  
  72.     cout<<ve.back()<<endl;//six //返回最后一个元素的引用   
  73. }  
  74. //迭代器;返回iterator,或reverse_iterator  
  75. void test3()  
  76. {   
  77.     vector<int>ve(4);  
  78.     ve[0]=0;ve[1]=1;ve[2]=2;ve[3]=3;  
  79.     cout<<ve[0]<<" "<<ve[1]<<" "<<ve[2]<<" "<<ve[3]<<endl;  
  80.     vector<int>::iterator iter;//定义一个迭代器iter  
  81.     iter=ve.begin();//返回一个iterator,它指向vector第一个元素  
  82.     cout<<*iter<<endl;//0  
  83.      iter=ve.end();//返回一个iterator,它指向vector最末尾元素的下一个位置(它不是末尾元素)  
  84.      //cout<<*iter<<endl;//会出现错误  
  85.      cout<<*(iter-1)<<endl;//3 用此方法访问末尾元素  
  86.      vector<int>::reverse_iterator reIter;//定义一个反向的迭代器  
  87.      reIter=ve.rbegin();//返回一个方向iterator,它指向vector末尾元素  
  88.     cout<<*reIter<<endl;//3  
  89.     reIter=ve.rend();//返回一个方向iterator,它指向vector第一个元素之前的位置(它是不存在的)  
  90.     cout<<*(reIter-1)<<endl;//0  用此方法访问第一个元素  
  91. }   
  92. //取得、设置长度、容量;返回void或size_type  
  93. void test4()  
  94. {   
  95.     vector<string> ve(8);  
  96.     cout<<ve.size()<<endl;//8  
  97.     cout<<ve.max_size()<<endl;//134217727,10737441823  
  98.     cout<<ve.capacity()<<endl;//8  
  99.     cout<<ve.empty()<<endl;//0,说明不为空,因为默认值是0  
  100.   
  101.     ve.assign(12,"3");  
  102.     cout<<ve.size()<<endl;//12  
  103.     cout<<ve.max_size()<<endl;//134217727(string),10737441823(int)  
  104.     cout<<ve.capacity()<<endl;//12  
  105.     cout<<ve.empty()<<endl;//0   
  106.   
  107.     ve.assign(1,"003");  
  108.     cout<<ve.size()<<endl;//1  返回vector当前持有元素的个数  
  109.     cout<<ve.max_size()<<endl;//他的最大个数与数据类型有关  
  110.     cout<<ve.capacity()<<endl;//12 容量 取得vector目前可容纳的最大元素个数。这个方法与存储配置有关,它通常只会增加,不会因为元素被删除而随之减少  
  111.     cout<<ve.empty()<<endl;//0 为空时,返回true  
  112.   
  113.     ve.resize(15,"W");//改变vector目前持有元素的个数  
  114.     cout<<ve.size()<<endl;//15  
  115.     cout<<ve.max_size()<<endl;//134217727(string),10737441823(int)  
  116.     cout<<ve.capacity()<<endl;//18  
  117.     cout<<ve.empty()<<endl;//0   
  118.   
  119.     ve.reserve(5);//如有必要,可改变vector的容量大小(只会增加,减少不起作用)  
  120.     cout<<ve.size()<<endl;//15  
  121.     cout<<ve.max_size()<<endl;//134217727(string),10737441823(int)  
  122.     cout<<ve.capacity()<<endl;//18 当ve.reserve(35);则输出35;则说明容量capacity只会增加不会减少  
  123.     cout<<ve.empty()<<endl;//0   
  124.   
  125.     vector<int> v(2,4);  
  126.     vector<int>vec(5,9);  
  127.     vec.swap(v);//两个vector进行交换  
  128.     cout<<v.size()<<" "<<v[0]<<endl;//5 9  
  129.     cout<<vec.size()<<" "<<vec[0]<<endl;//2 4  
  130.   
  131. }   
  132. //遍历vector  
  133. void test5()  
  134. {   
  135.     vector<int> vec;  
  136.     for (int i=0;i<10;i++)  
  137.     {  
  138.         vec.push_back(i);  
  139.     }  
  140.     for (int i=0;i<vec.size();i++)   
  141.         cout<<vec[i]<<" ";  
  142.     cout<<endl;  
  143.   
  144.     vector<int>::iterator iter;  
  145.     for (iter=vec.begin();iter!=vec.end();iter++)  
  146.         cout<<*iter<<" ";  
  147.     cout<<endl;  
  148.   
  149.     vector<int>::reverse_iterator reIter;  
  150.     for (reIter=vec.rbegin();reIter!=vec.rend();reIter++)   
  151.         cout<<*reIter<<" ";//9 8 7 6 5 4 3 2 1 0  
  152.     cout<<endl;  
  153.   
  154.     vector<int>::reverse_iterator revIter;  
  155.     for (revIter=vec.rend()-1;revIter!=vec.rbegin();revIter--)   
  156.         cout<<*revIter<<" ";//0 1 2 3 4 5 6 7 8 //有点残缺  
  157.     cout<<endl;  
  158. }   
  159. void Test(char h)  
  160. {  
  161.     cout<<"press key===="<<h<<endl;  
  162.     switch(h)  
  163.     {   
  164.     case '0':  test0();break;  
  165.     case '1':  test1();break;  
  166.     case '2':  test2();break;  
  167.     case '3':  test3();break;  
  168.     case '4':  test4();break;  
  169.     case '5':  test5();break;    
  170.     case 27:  
  171.     case 'q':exit(0);break;   
  172.     default:cout<<"default "<<h<<endl;break;  
  173.     }  
  174. }  
  175. void main()  
  176. {  
  177.     while(1)  
  178.     {  
  179.         Test(getch());  
  180.     }   
  181. }  

list网上实例

 

list的函数共有五大类:定义及初始化,增加删除元素,访问元素,返回迭代器,其他

[cpp] view plain copy print ?
  1. #include <string>  
  2. #include <vector>   
  3. #include <list>  
  4. #include <conio.h>  
  5. #include<iostream>  
  6. using namespace std;    
  7. void PrintListInt(list<int>& param)  
  8. {  
  9.     for (list<int>::iterator iter=param.begin();iter!=param.end();iter++)  
  10.     {  
  11.         cout<<*iter<<" ";  
  12.     }  
  13.     cout<<endl;      
  14. }  
  15. void PrintListString(list<string>& param)  
  16. {  
  17.     for (list<string>::iterator iter=param.begin();iter!=param.end();iter++)  
  18.     {  
  19.         cout<<*iter<<" ";  
  20.     }  
  21.     cout<<endl;      
  22. }  
  23. //定义及初始化;没有返回值,或void  
  24. void test0()  
  25. {   
  26.     list<int> first(4);//定义并初始化4个0  
  27.     PrintListInt(first);//0 0 0 0  
  28.     list<int> second(3,88);//定义并初始化3个88  
  29.     PrintListInt(second);//88 88 88   
  30.     first.assign(4,90);//assign赋值  //4个90  
  31.     second.assign(first.begin(),first.end());//second拷贝first  
  32.     int arr[]={23,45,56};  
  33.     second.assign(arr,arr+2);  
  34.     PrintListInt(second);//23 45 (没有56,者说明assign赋值是[begin,end),而不是[begin,end])  
  35.     second.assign(0,0);//清空second  
  36.     PrintListInt(second);//为空    
  37. }  
  38. //增加删除元素;返回值是void,除erase()的返回值是iterator外  
  39. void test1()  
  40. {   
  41.     list<int> first(3,8);  
  42.     first.push_back(6);//增加一个元素在list末端  
  43.     first.push_front(2);//增加一个元素在list前端  
  44.     PrintListInt(first);//2 8 8 8 6  
  45.     first.pop_back();//删除list末端元素  
  46.     first.pop_front();//删除list前端元素  
  47.     PrintListInt(first);//8 8 8   
  48.     first.insert(first.begin(),5);//在前端添加一个元素,不可以first.begin()+1;但vector<int>ve(4);ve.insert(ve.begin()+1,4);却可以  
  49.     first.insert(first.end(),2,9);//在末端添加两个元素,同上,end()-2不可以,但vector的end()-2可以  
  50.     PrintListInt(first);//5 8 8 8 9 9  
  51.     list<int>second;  
  52.     second.insert(second.end(),first.begin(),first.end());//second赋值first  
  53.     PrintListInt(second);//5 8 8 8 9 9  
  54.   
  55.     second.erase(second.begin());//删除前端元素,参数不能为second.begin()+1,当然也不能为second.end();若要删除第二个元素,则可通过++second.begin(),或iterator,然后iterator++  
  56.     PrintListInt(second);//8 8 8 9 9   
  57.     second.erase(second.begin(),second.end());//全部删除  
  58.     PrintListInt(second);//为空  
  59.   
  60.     first.remove(77);//删除77这个不存在的元素   
  61.     PrintListInt(first);//5 8 8 8 9 9  
  62.     first.remove(8);//删除所有的8这个元素  
  63.     PrintListInt(first);//5 9 9  
  64.     if (!first.empty())   
  65.         first.clear();//全部清除  
  66.     PrintListInt(first);//为空   
  67.     //在list的函数insert(),erase()的函数参数时(iterator+2)是不可以的,只可以通过不停地iterator++;这一点与vector的insert(),erase()不同,可以通过iterator+2来很方便的删除任意位置的元素。因为它们存储的内存地址不一定连续的,所以不能通过iterator+、-N来访问第N个元素,只能通过iterator++来逐一访问,甚至量iterator=iterator+1都不行  
  68.     //由于list是双向链表,所以比线性表vector多提供了增加删除元素的函数,push_front(),pop_front(),remove(),remove_if()  
  69. }  
  70. //访问获取元素;返回值是Type T  
  71. void test2()  
  72. {   
  73.     list<int> first;  
  74.     for(int i=0;i<5;i++)  
  75.         first.push_back(i);  
  76.      cout<<first.front()<<endl;//0 返回前端元素的引用  
  77.      cout<<first.back()<<endl;//4 返回末端元素的引用  
  78.     //由于list是双向链表,所有没有像线性表vector那样提供下标索引,at()来提供方便的数据访问函数  
  79. }  
  80. //返回迭代器;返回值是iterator,或reverse_iterator  
  81. void test3()  
  82. {   
  83.     list<int> first;  
  84.     for(int i=0;i<5;i++)  
  85.         first.push_back(i);   
  86.      cout<<*first.begin()<<endl;//0 不可以 cout<<*first.end()<<endl;不然会崩溃  
  87.      cout<<*first.rbegin()<<endl;//4 不可以cout<<*first.rend()<<endl;不然会崩溃  
  88.      for(list<int>::iterator it=first.begin();it!=first.end();it++)  
  89.          cout<<*it<<" ";//0 1 2 3 4  
  90.      cout<<endl;  
  91.      list<int>::reverse_iterator reIt=first.rbegin();  
  92.      while(reIt!=first.rend())  
  93.      {  
  94.          cout<<*reIt<<" ";//4 3 2 1 0  
  95.          reIt++;//记住是++,因为他是rbegin中的begin  
  96.      }  
  97.      cout<<endl;  
  98.      //与vector提供的函数相同begin(),end(),rbegin(),rend();不同的iterator不可以+N  
  99. }   
  100. //其他  
  101. void test4()  
  102. {   
  103.     list<string> ve(2);  
  104.     cout<<ve.size()<<endl;//2   
  105.     cout<<ve.max_size()<<endl;//134217727(string),10737441823(int)  
  106.     ve.resize(7);  
  107.     cout<<ve.size()<<endl;//7   
  108.     //与vector不同的是少了capacity(),reserve()获取容量,设置容量  
  109.   
  110.     list<int> first;  
  111.     for(int i=0;i<5;i++)  
  112.         first.push_back(i);   
  113.     first.reverse();//逆序  
  114.     PrintListInt(first);//4 3 2 1 0  
  115.     list<int>second(2,9);  
  116.     second.swap(first);//两个list之间交互数据  
  117.     PrintListInt(first);//9 9  
  118.     PrintListInt(second);// 4 3 2 1 0  
  119.     first.sort();  
  120.     second.sort();//排序(从小到大)  
  121.     PrintListInt(second);//0 1 2 3 4  
  122.     first.merge(second);//second合并到first中,之后second为空。这里需要注意的是:在调用合并函数merge()之前,first和second都必须是从小到大的排序的  
  123.     PrintListInt(first);//0 1 2 3 4 9 9  
  124.     PrintListInt(second);//为空  
  125.     first.unique();//使唯一,删除相同的数据  
  126.     PrintListInt(first);//0 1 2 3 4 9  
  127.     //比vector多提供了逆序reverse(),排序sort(),和并merge(),使唯一unique()等数据处理的函数  
  128.   
  129.     list<int> one,two;  
  130.     for(int i=0;i<4;i++)  
  131.     {  
  132.         one.push_back(i*5);//0 5 10 15  
  133.         two.push_back(i*10);//0 10 20 30   
  134.     }  
  135.     one.splice(one.begin(),two);//在begin位置拼接整个two列表元素  
  136.     PrintListInt(one);//0 10 20 30 0 5 10 15  
  137.     PrintListInt(two);//为空  
  138.     two.assign(3,2);  
  139.     one.splice(one.begin(),two,two.begin());//在one列表的前端拼接two列表的一个前端元素  
  140.     PrintListInt(one);//2 0 10 20 30 0 5 10 15  
  141.     PrintListInt(two);//2 2  
  142.     one.splice(one.end(),two,two.begin(),two.end());//在one列表的end位置拼接整个two列表元素  
  143.     PrintListInt(two);//2 0 10 20 30 0 5 10 15 2 2  
  144.     PrintListInt(one);//为空  
  145. }   
  146. //遍历list  
  147. void test5()  
  148. {   
  149.     list<int> vec;  
  150.     for (int i=0;i<10;i++)  
  151.     {  
  152.         vec.push_back(i);  
  153.     }   
  154.   
  155.     list<int>::iterator iter;  
  156.     for (iter=vec.begin();iter!=vec.end();iter++)  
  157.         cout<<*iter<<" ";  
  158.     cout<<endl;  
  159.   
  160.     list<int>::reverse_iterator reIter;  
  161.     for (reIter=vec.rbegin();reIter!=vec.rend();reIter++)   
  162.         cout<<*reIter<<" ";//9 8 7 6 5 4 3 2 1 0  
  163.     cout<<endl;  
  164.   
  165.     vec.reverse();  
  166.     list<int>::reverse_iterator reveIter=vec.rbegin();  
  167.     while(reveIter!=vec.rend())  
  168.     {  
  169.         cout<<*reveIter<<" ";//0 1 2 3 4 5 6 7 8 9  
  170.         reveIter++;  
  171.     }  
  172.     cout<<endl;      
  173. }   
  174. void Test(char h)  
  175. {  
  176.     cout<<"press key===="<<h<<endl;  
  177.     switch(h)  
  178.     {   
  179.     case '0':  test0();break;  
  180.     case '1':  test1();break;  
  181.     case '2':  test2();break;  
  182.     case '3':  test3();break;  
  183.     case '4':  test4();break;  
  184.     case '5':  test5();break;   
  185.     case 27:  
  186.     case 'q':exit(0);break;   
  187.     default:cout<<"default "<<h<<endl;break;  
  188.     }  
  189. }  
  190. void main()  
  191. {  
  192.     while(1)  
  193.     {  
  194.         Test(getch());  
  195.     }   
  196. }</int>  

deque   上网实例

list的函数共有五大类:定义及初始化,增加删除元素,访问元素,返回迭代器,其他

 

[cpp] view plain copy print ?
  1. #include <string>  
  2. #include <deque>  
  3. #include <conio.h>  
  4. #include<iostream>  
  5. using namespace std;    
  6. //定义及初始化;无返回值或void  
  7. void PrintDequeInt(deque<int> param)  
  8. {  
  9.     for (deque<int>::iterator iter=param.begin();iter!=param.end();iter++)  
  10.     {  
  11.         cout<<*iter<<" ";  
  12.     }  
  13.     cout<<endl;     
  14. }  
  15. void PrintDequeString(deque<string> param)  
  16. {  
  17.     for (deque<string>::iterator iter=param.begin();iter!=param.end();iter++)  
  18.     {  
  19.         cout<<*iter<<" ";  
  20.     }  
  21.     cout<<endl;     
  22. }  
  23. void test0()  
  24. {    
  25.     deque<int> d;//创建一个空的deque  
  26.     deque<int> de(2);//创建一个deque,含有2个缺省默认的数据0  
  27.     deque<int> deq(3,5);//创建一个含有3个5拷贝的deque  
  28.     deque<int> dequ(deq);//复制一个deque  
  29.     deque<int> first(dequ.begin(),dequ.end());//创建一个以[beg,end)区间的deque  
  30.     PrintDequeInt(first);//5 5 5  
  31.     d.assign(2,7);  
  32.     PrintDequeInt(d);//7 7  
  33.     de.assign(deq.begin(),deq.end());  
  34.     PrintDequeInt(de);//5 5 5  
  35.     //deque,list,vector的完全相同  
  36. }  
  37. //增加删除元素;返回值为void,除erase()的返回值为iterator外  
  38. void test1()  
  39. {    
  40.     deque<string> first(2);//创建一个deque,含有2个缺省默认的数据" "  
  41.     cout<<first.at(0)<<" "<<first.at(1)<<" "<<endl;  
  42.     first.push_back("world");//在尾部加入一个数据  
  43.     first.push_front("hello ");//在头部插入一个数据  
  44.     first.pop_back();//删除最后一个数据  
  45.     first.pop_front();//删除头部数据  
  46.        
  47.     first.assign(1,"women");  
  48.     PrintDequeString(first);  
  49.     first.insert(first.begin()+1,"nihao");//在pos位置插入一个“nihao”;返回新数据的位置;注意pos位置要存在,eg:此begin()+2就不行,因为它表示第3个位置  
  50.     PrintDequeString(first); //women nihao  
  51.     first.insert(first.end(),2,"W");//注意他返回的是void  
  52.     PrintDequeString(first);//women nihao W W  
  53.     //first.insert(first.end(),first.begin(),first.end()); 不可以,当vector却可以   
  54.   
  55.     first.erase(first.begin());//删除pos位置的数据,返回下一个数据的位置  
  56.     PrintDequeString(first);//nihao W W  
  57.     first.erase(first.begin(),first.begin()+2);//删除[beg,end)区间的数据;放回下一个数据的位置  
  58.     PrintDequeString(first);//W  
  59.     first.clear();//删除容器中所有的的数据,可以用empty()来判断是否删除完  
  60.     //比vector多提供了pop_front()和push_front(),其他的完全相同  
  61.     //与list提供的函数完全相同,不过list的参数first.begin()不可以+1,+2,而deque却可以  
  62. }  
  63. //访问获取元素;返回值为TYPE T  
  64. void test2()  
  65. {    
  66.     string str[]={"one","two","three","four","five","six"};  
  67.     deque<string> ve(str,str+6);   
  68.     for(int i=0;i<6;i++)   
  69.     {   
  70.         cout<<ve.at(i)<<" ";//使用at()通过i来进行访问,也不能越界。若越界,在调试时,会抛出异常;在运行时直接弹出错误  
  71.     }  
  72.     cout<<endl;  
  73.     cout<<ve.front()<<endl;//one //返回第一个元素的引用  
  74.     cout<<ve.back()<<endl;//six //返回最后一个元素的引用   
  75.     //与vector完全相同,也提供了at()  
  76.     //比list多提供了一个访问元素的函数at()  
  77. }  
  78. //返回迭代器;返回值为iterator或reverse_iterator  
  79. void test3()  
  80. {    
  81.     deque<int>ve(4);  
  82.     ve[0]=0;ve[1]=1;ve[2]=2;ve[3]=3;  
  83.     cout<<ve[0]<<" "<<ve[1]<<" "<<ve[2]<<" "<<ve[3]<<endl;  
  84.     deque<int>::iterator iter;//定义一个迭代器iter  
  85.     iter=ve.begin();//返回一个iterator,它指向deque第一个元素  
  86.     cout<<*iter<<endl;//0  
  87.     iter=ve.end();//返回一个iterator,它指向deque最末尾元素的下一个位置(它不是末尾元素)  
  88.     //cout<<*iter<<endl;//会出现错误  
  89.     cout<<*(iter-1)<<endl;//3 用此方法访问末尾元素  
  90.     deque<int>::reverse_iterator reIter;//定义一个反向的迭代器  
  91.     reIter=ve.rbegin();//返回一个方向iterator,它指向deque末尾元素  
  92.     cout<<*reIter<<endl;//3  
  93.     reIter=ve.rend();//返回一个方向iterator,它指向deque第一个元素之前的位置(它是不存在的)  
  94.     cout<<*(reIter-1)<<endl;//0  用此方法访问第一个元素  
  95.     //与vector提供的函数与用法完全相同  
  96.     //与list提供的函数相同,用法略有不同:list的iterator不可以加减n;deque却可以  
  97. }   
  98. //其他  
  99. void test4()  
  100. {    
  101.     deque<string> ve(8,"ss");  
  102.     cout<<ve.size()<<endl;//8  
  103.     cout<<ve.max_size()<<endl;//134217727,10737441823   
  104.     ve.resize(2);//重置长度2    cout<<ve[2]<<endl;//会有问题因为[2]不存在      
  105.     deque<string> de(4,"hh");  
  106.     de.swap(ve);//将de与ve元素互换  
  107.     cout<<ve.size()<<" "<<ve.front()<<endl;//4 hh  
  108.     cout<<de.size()<<" "<<de.front()<<endl;//2 ss  
  109.     //比vector少了获得容量函数capacity(),设置容量函数reserve()  
  110.     //比list少了sort(),merge(),remove(),remove_if(),reverse(),splice(),unique()  
  111. }   
  112. //遍历deque  
  113. void test5()  
  114. {    
  115.     deque<int> vec;  
  116.     for (int i=0;i<10;i++)  
  117.     {  
  118.         vec.push_back(i);  
  119.     }  
  120.     for (int i=0;i<vec.size();i++)   
  121.         cout<<vec[i]<<" ";  
  122.     cout<<endl;  
  123.   
  124.     deque<int>::iterator iter;  
  125.     for (iter=vec.begin();iter!=vec.end();iter++)  
  126.         cout<<*iter<<" ";  
  127.     cout<<endl;  
  128.   
  129.     deque<int>::reverse_iterator reIter;  
  130.     for (reIter=vec.rbegin();reIter!=vec.rend();reIter++)   
  131.         cout<<*reIter<<" ";//9 8 7 6 5 4 3 2 1 0  
  132.     cout<<endl;  
  133.   
  134.     deque<int>::reverse_iterator revIter;  
  135.     for (revIter=vec.rend()-1;revIter!=vec.rbegin();revIter--)   
  136.         cout<<*revIter<<" ";//0 1 2 3 4 5 6 7 8 //有点残缺  
  137.     cout<<endl;  
  138. }   
  139. void Test(char h)  
  140. {  
  141.     cout<<"press key===="<<h<<endl;  
  142.     switch(h)  
  143.     {   
  144.     case '0':  test0();break;  
  145.     case '1':  test1();break;  
  146.     case '2':  test2();break;  
  147.     case '3':  test3();break;  
  148.     case '4':  test4();break;  
  149.     case '5':  test5();break;   
  150.     case 27:  
  151.     case 'q':exit(0);break;   
  152.     default:cout<<"default "<<h<<endl;break;  
  153.     }  
  154. }  
  155. void main()  
  156. {  
  157.     while(1)  
  158.     {  
  159.         Test(getch());  
  160.     }   

栈、队列、优先队列

栈stack    网上实例

队列queue    网上实例

优先队列priority_queue   网上实例

[cpp] view plain copy print ?
  1. #include <string>  
  2. #include <stack>  
  3. #include <queue>   
  4. #include <conio.h>  
  5. #include<iostream>  
  6. using namespace std;     
  7. //栈stack的用法  
  8. void test0()  
  9. {  
  10.     stack<int> st;   
  11.     for (int i=0;i<4;i++)  
  12.         st.push(i*10); //压栈  
  13.     cout<<st.top()<<" "<<st.size()<<endl; //30 4  
  14.     for (int i=0;i<4;i++)   
  15.     {  
  16.         cout<<st.top()<<" ";//30 20 10 0  
  17.         st.pop();//出栈  
  18.     }  
  19.     cout<<endl<<st.size()<<" "<<st.empty()<<endl;//0 1  
  20.   
  21.     stack<int> first,scond;  
  22.     for (int i=0;i<5;i++)  
  23.     {  
  24.         first.push(i*5);  
  25.         scond.push(i*2);  
  26.     }  
  27.     first.swap(scond);//将栈first与scond元素互换  
  28.     first.emplace(444); //安放 它与push()的功能相同  
  29.     scond.emplace(852);  
  30.   
  31.     while (!first.empty())  
  32.     {  
  33.         cout<<first.top()<<" ";//444 8 6 4 2 0  
  34.         first.pop();  
  35.     }  
  36.     cout<<endl;  
  37.     while (!scond.empty())  
  38.     {  
  39.         cout<<scond.top()<<" ";//852 20 15 10 5 0  
  40.         scond.pop();  
  41.     }  
  42.     cout<<endl;      
  43.     //栈stack,提供访问数据的接口只有一个top();而vector,list,deque则提供访问数的接口有:iterator,front(),back();queue则提供的是back(),front(),没有iterator  
  44. }  
  45. //队列queue的用法  
  46. void test1()  
  47. {  
  48.     queue<int> q;  
  49.     for(int i=0;i<5;i++)  
  50.         q.push(i);//在队尾增加元素  
  51.     //返回元素数目,返回队头元素,返回队尾元素,是否为空  
  52.     cout<<q.size()<<" "<<q.front()<<" "<<q.back()<<" "<<q.empty()<<endl;//5 0 4 0  
  53.     q.pop();//删除队头元素  
  54.     cout<<q.front()<<" "<<q.back()<<endl;//1 4   
  55.   
  56.     queue<int> first,scond;  
  57.     for (int i=0;i<5;i++)  
  58.     {  
  59.         first.push(i*5);  
  60.         scond.push(i*2);  
  61.     }  
  62.     first.swap(scond);//将队列first与scond元素互换  
  63.     first.emplace(444); //安放 它与push()的功能相同  
  64.     scond.emplace(852);  
  65.   
  66.     while (!first.empty())  
  67.     {  
  68.         cout<<first.front()<<" ";//0 2 4 6 8 444  
  69.         first.pop();  
  70.     }  
  71.     cout<<endl;  
  72.     while (!scond.empty())  
  73.     {  
  74.         cout<<scond.front()<<" ";//0 5 10 15 20 852  
  75.         scond.pop();  
  76.     }  
  77.     cout<<endl;  
  78. }  
  79. //优先队列priorityQueue的用法;插入的数据(按照某种顺序)自动排序  
  80. void test2()  
  81. {  
  82.     priority_queue<int>pq;  
  83.     pq.push(34);  
  84.     pq.push(21);  
  85.     pq.push(45);  
  86.     pq.push(9);  
  87.     //返回元素数目,返回队头元素,返回队尾元素,是否为空  
  88.     cout<<pq.size()<<" "<<pq.top()<<" "<<pq.empty()<<endl;//4 45 0  
  89.     while(!pq.empty())  
  90.     {  
  91.         cout<<pq.top()<<" ";//45 34 21 9  
  92.         pq.pop();  
  93.     }  
  94.     cout<<endl;   
  95.     priority_queue<int> first,scond;  
  96.     for (int i=0;i<5;i++)  
  97.     {  
  98.         first.push(i*5);  
  99.         scond.push(i*2);  
  100.     }  
  101.     first.swap(scond);//将优先队列first与scond元素互换  
  102.     first.emplace(444); //安放 它与push()的功能相同  
  103.     scond.emplace(852);  
  104.   
  105.     while (!first.empty())  
  106.     {  
  107.         cout<<first.top()<<" ";//444 8 6 4 2 0  
  108.         first.pop();  
  109.     }  
  110.     cout<<endl;  
  111.     while (!scond.empty())  
  112.     {  
  113.         cout<<scond.top()<<" ";//852 20 15 10 5 0  
  114.         scond.pop();  
  115.     }  
  116.     cout<<endl;  
  117. }  
  118. void Test(char h)  
  119. {  
  120.     cout<<"press key===="<<h<<endl;  
  121.     switch(h)  
  122.     {   
  123.     case '0':  test0();break;  
  124.     case '1':  test1();break;  
  125.     case '2':  test2();break;   
  126.     case 27:  
  127.     case 'q':exit(0);break;   
  128.     default:cout<<"default "<<h<<endl;break;  
  129.     }  
  130. }  
  131. void main()  
  132. {  
  133.     while(1)  
  134.     {  
  135.         Test(getch());  
  136.     }   
  137. }  

 

容器适配器

容器适配器:是用基本的容器改造出的容器。共有的成员函数:empty(),size(),push(),pop(),(front(),back()/top()),swap(),emplace()
栈stack:是先进后出(FILO)的数据结构,可用vector,list,deque来实现,默认用deque实现。只能插入push(),删除pop(),访问栈顶元素top()
队列queue:是先进先出(FIFO)的数据结构,可用list,deque来实现,默认用deque实现。也提供了push(),pop()但是push()发生在队尾,pop()发生在队头。与stack不同的是top()变成了(front(),back())返回队头元素front(),返回队尾元素back(),
优先队列priority_queue:可用vector,deque实现,默认用vector实现。插入到容器中的元素自动排序(从大到小),这些元素是有优先级的,大的在前小的在后,与queue不同的是由front(),back()变成一个top()


你可能感兴趣的:(C++STL基础)