STL容器之双端队列和表容器类

STLC++的一个类库。STL中的容器有队列容器和关联容器,容器适配器(congtainer adapters:stack,queue,priority queue),位集(bit_set),串包(string_package)等等。

川汇网站建设公司创新互联,川汇网站设计制作,有大型网站制作公司丰富经验。已为川汇上千提供企业网站建设服务。企业网站搭建\成都外贸网站建设要多少钱,请找那个售后服务好的川汇做网站的公司定做!

在系列中,我将介绍list,vector,deque等队列容器,和set和multisets,map和multimaps等关联容器,一共7种基本容器类。

队列容器(顺序容器):队列容器按照线性排列来存储T类型值的集合,队列的每个成员都有自己的特有的位置。顺序容器有向量类型、双端队列类型、列表类型三种。

下面介绍双端队列容器类和表容器类。

双端队列(deque容器类):

deque(读音:deck,意即:double queue,#include)容器类与vector类似,支持随机访问和快速插入删除,它在容器中某一位置上的操作所花费的是线性时间。与vector不同的是,deque还支持从开始端插入数据:push_front()。

此外deque也不支持与vector的capacity()、reserve()类似的操作。

 
 
 
  1. #include 
  2. #include 
  3. using namespace std;
  4. typedef deque INTDEQUE;//有些人很讨厌这种定义法,呵呵
  5. //从前向后显示deque队列的全部元素
  6. void put_deque(INTDEQUE deque, char *name)
  7. {
  8. INTDEQUE::iterator pdeque;//仍然使用迭代器输出
  9. cout << "The contents of " << name << " : ";
  10. for(pdeque = deque.begin(); pdeque != deque.end(); pdeque++)
  11. cout << *pdeque << " ";//注意有 "*"号哦,没有"*"号的话会报错
  12. cout<
  13. }
  14. //测试deqtor容器的功能
  15. int main()
  16. {
  17. //deq1对象初始为空
  18. INTDEQUE deq1; 
  19. //deq2对象最初有10个值为6的元素 
  20. INTDEQUE deq2(10,6); 
  21. //声明一个名为i的双向迭代器变量
  22. INTDEQUE::iterator i;
  23. //从前向后显示deq1中的数据
  24. put_deque(deq1,"deq1");
  25. //从前向后显示deq2中的数据
  26. put_deque(deq2,"deq2");
  27. //从deq1序列后面添加两个元素
  28. deq1.push_back(2);
  29. deq1.push_back(4);
  30. cout<<"deq1.push_back(2) and deq1.push_back(4):"<
  31. put_deque(deq1,"deq1");
  32. //从deq1序列前面添加两个元素
  33. deq1.push_front(5);
  34. deq1.push_front(7);
  35. cout<<"deq1.push_front(5) and deq1.push_front(7):"<
  36. put_deque(deq1,"deq1");
  37. //在deq1序列中间插入数据
  38. deq1.insert(deq1.begin()+1,3,9);
  39. cout<<"deq1.insert(deq1.begin()+1,3,9):"<
  40. put_deque(deq1,"deq1");
  41. //测试引用类函数
  42. cout<<"deq1.at(4)="<
  43. cout<<"deq1[4]="<
  44. deq1.at(1)=10;
  45. deq1[2]=12;
  46. cout<<"deq1.at(1)=10 and deq1[2]=12 :"<
  47. put_deque(deq1,"deq1");
  48. //从deq1序列的前后各移去一个元素
  49. deq1.pop_front();
  50. deq1.pop_back();
  51. cout<<"deq1.pop_front() and deq1.pop_back():"<
  52. put_deque(deq1,"deq1");
  53. //清除deq1中的第2个元素
  54. deq1.erase(deq1.begin()+1);
  55. cout<<"deq1.erase(deq1.begin()+1):"<
  56. put_deque(deq1,"deq1");
  57. //对deq2赋值并显示
  58. deq2.assign(8,1);
  59. cout<<"deq2.assign(8,1):"<
  60. put_deque(deq2,"deq2");
  61. }

上面我们演示了deque如何进行插入删除等操作,像erase(),assign()是大多数容器都有的操作。关于deque的其他操作请参阅其书籍。

表(List容器类)

List(#include)又叫链表,是一种双线性列表,只能顺序访问(从前向后或者从后向前),图2是list的数据组织形式。与前面两种容器类有一个明显的区别就是:它不支持随机访问。要访问表中某个下标处的项需要从表头或表尾处(接近该下标的一端)开始循环。而且缺少下标预算符:operator[]。

同时,list仍然包涵了erase(),begin(),end(),insert(),push_back(),push_front()这些基本函数,下面我们来演示一下list的其他函数功能。

  • merge():合并两个排序列表;
  • splice():拼接两个列表;
  • sort():列表的排序
 
 
 
  1. #include 
  2. #include 
  3. #include 
  4. using namespace std;
  5. void PrintIt(list n)
  6. {
  7. for(list::iterator iter=n.begin(); iter!=n.end(); ++iter)
  8. cout<<*iter<<" ";//用迭代器进行输出循环 
  9. }
  10. int main()
  11. {
  12. list listn1,listn2; //给listn1,listn2初始化 
  13. listn1.push_back(123);
  14. listn1.push_back(0);
  15. listn1.push_back(34);
  16. listn1.push_back(1123); //now listn1:123,0,34,1123 
  17. listn2.push_back(100);
  18. listn2.push_back(12); //now listn2:12,100
  19. listn1.sort();
  20. listn2.sort(); //给listn1和listn2排序
  21. //now listn1:0,34,123,1123 listn2:12,100 
  22. PrintIt(listn1);
  23. cout<
  24. PrintIt(listn2);
  25. listn1.merge(listn2); //合并两个排序列表后,listn1:0,12,34,100,123,1123 
  26. cout<
  27. PrintIt(listn1);
  28. }

上面并没有演示splice()函数的用法,这是一个拗口的函数。用起来有点麻烦。图3所示是splice函数的功能。将一个列表插入到另一个列表当中。list容器类定义了splice()函数的3个版本:

 
 
 
  1. splice(position,list_value);
  2. splice(position,list_value,ptr);
  3. splice(position,list_value,first,last);

ist_value是一个已存在的列表,它将被插入到源列表中,position是一个迭代参数,他当前指向的是要进行拼接的列表中的特定位置。

listn1:123,0,34,1123 listn2:12,100

执行listn1.splice(find(listn1.begin(),listn1.end(),0),listn2);之后,listn1将变为:123,12,100,34,1123。即把listn2插入到listn1的0这个元素之前。其中,find()函数找到0这个元素在listn1中的位置。值得注意的是,在执行splice之后,list_value将不复存在了。这个例子中是listn2将不再存在。

第二个版本当中的ptr是一个迭代器参数,执行的结果是把ptr所指向的值直接插入到position当前指向的位置之前.这将只向源列表中插入一个元素。

第三个版本的first和last也是迭代器参数,并不等于list_value.begin(),list_value.end()。First指的是要插入的列的第一个元素,last指的是要插入的列的最后一个元素。

如果listn1:123,0,34,1123 listn2:12,43,87,100 执行完以下函数之后

listn1.splice(find(listn1.begin(),listn1.end(),0),++listn2.begin(),--listn2.end());

listn1:123,43,87,0,34,1123 listn2:12,100

以上,我们学习了deque,list两种基本顺序容器,其他的顺序容器还有:slist,bit_vector等等。请继续下一篇>>

文章名称:STL容器之双端队列和表容器类
网页URL:http://www.shufengxianlan.com/qtweb/news48/297798.html

网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联