C++ STL入门教程(2)——list(双向链表)的使用(附完整程序代码)

3 篇文章 0 订阅

一、简介

Unlike other standard sequence containers, list and forward_list objects are specifically designed to be efficient inserting and removing elements in any position, even in the middle of the sequence.

Lists将元素按顺序储存在链表中。与向量(vector)相比, 它允许快速的插入和删除,但是随机访问却比较慢。(vector支持快速随机访问)

前一篇就提到过,list可以在头部进行添加删除操作,但vector不行。

下面是几个list特有的函数。(从另一方面说明list在删除操作方面的速度之快)

remove()从list删除元素
remove_if()按指定条件删除元素
reverse()把list的元素倒转
sort()给list排序
unique()删除list中重复的元素


二、完整程序代码


[cpp]  view plain copy
  1. /*请务必运行以下程序后对照阅读*/  
  2.   
  3. #include <list>  
  4. #include <iostream>  
  5. #include <algorithm>  
  6. using namespace std;  
  7.   
  8. void print(int num)  
  9. {  
  10.     cout << num << " ";  
  11. }  
  12.   
  13. bool IsOdd(int i)  
  14. {  
  15.     return ((i & 1) == 1);  
  16. }  
  17.   
  18. int main()  
  19. {  
  20.     //1. 初始化  
  21.     list<int> v;  
  22.     list<int>::iterator iv;  
  23.   
  24.     v.assign(10, 2);//将10个值为2的元素赋到list中  
  25.     cout << v.size() << endl; //返回list实际含有的元素数量  
  26.     cout << endl;  
  27.   
  28.     //2. 添加  
  29.     v.push_front(666);  
  30.     for (int i = 0; i < 10; i++)  
  31.         v.push_back(i);  
  32.     for_each(v.begin(), v.end(), print);//需要#include <algorithm>  
  33.     cout << endl;  
  34.     cout << v.size() << endl;  
  35.     cout << endl;  
  36.   
  37.     //3. 插入及遍历、逆遍历和倒转  
  38.     v.insert(v.begin() , 99);//不能+和-了  
  39.     v.insert(v.end() , 99);  
  40.   
  41.     for_each(v.begin(), v.end(), print);  
  42.     cout << endl;  
  43.     for_each(v.rbegin(), v.rend(), print);//在逆序迭代器上做++运算将指向容器中的前一个元素  
  44.     cout << endl;  
  45.   
  46.     //一般遍历写法  
  47.     for(iv = v.begin(); iv != v.end(); ++iv)  
  48.         cout << *iv << " ";  
  49.     cout << endl;  
  50.   
  51.     v.reverse();  
  52.     for_each(v.begin(), v.end(), print);  
  53.     cout << endl;  
  54.     for_each(v.rbegin(), v.rend(), print);  
  55.     cout << endl;  
  56.     cout << endl;  
  57.   
  58.     //4. 排序  
  59.     v.sort();//为链表排序,默认是升序。  
  60.     for_each(v.begin(), v.end(), print);  
  61.     cout << endl;  
  62.     cout << endl;  
  63.   
  64.     //5. 删除  
  65.     v.erase(v.begin());  
  66.     for_each(v.begin(), v.end(), print);  
  67.     cout << endl;  
  68.     v.insert(v.begin() , 99);//还原  
  69.   
  70.     //删掉链表中所有重复的元素  
  71.     v.unique();  
  72.     for_each(v.begin(), v.end(), print);  
  73.     cout << endl;  
  74.   
  75.     //去掉所有含2的元素  
  76.     v.remove(2);  
  77.     for_each(v.begin(), v.end(), print);  
  78.     cout << endl;  
  79.   
  80.     //删掉所有奇数  
  81.     v.remove_if(IsOdd);  
  82.     for_each(v.begin(), v.end(), print);  
  83.     cout << endl;  
  84.   
  85.     v.pop_front();  
  86.     v.pop_back();  
  87.     for_each(v.begin(), v.end(), print);  
  88.     cout << endl;  
  89.     cout << endl;  
  90.   
  91.     //6. 查询  
  92.     cout << v.front() << endl;  
  93.     cout << v.back() << endl;  
  94.   
  95.     //7. 清空  
  96.     v.clear();  
  97.     cout << v.size() << endl;//0  
  98.     for_each(v.begin(), v.end(), print); //已经clear,v.begin()==v.end(),不会有任何结果。  
  99.   
  100.     return 0;  
  101. }  


当然,我们也可以用动态数组作为保存的数据类型:

[cpp]  view plain copy
  1. #include<iostream>  
  2. #include<string>  
  3. #include<list>  
  4. using namespace std;  
  5.   
  6. int main()  
  7. {  
  8.     list<char *> li;  
  9.     list<char *>::iterator iter;  
  10.     li.push_back("123");  
  11.     li.push_back("456");  
  12.     li.push_back("789");  
  13.     for (iter = li.begin(); iter != li.end(); ++iter)  
  14.         cout << *iter << endl;  
  15.     return 0;  
  16. }  

三、补充

对比vector和list在查询(随机检索)和维护(插入和删除)上的区别:

a) 查询

vector:由于vector中的元素是连续存储的,所以我们能够直接的访问第n个元素。

list:由于list中的元素不是在内存中连续存储的,下一个元素的内存地址保存在前一个元素中,所以我们必须一个一个的访问前面的元素,最后才能访问第n个元素。

当然,对于顺序访问就二者就差不多了。

b) 维护

vector:在vector中插入/删除一个元素的话,我们需要移动插入/删除位置之后的所有元素。如果在vector插入/删除元素后有大量元素的情况下,显而易见,这些移动和删除操作会大量的消耗CPU时间。

list:使用list进行这些操作的时候,其仅仅是修改插入/删除元素之前的元素到后一个元素的指针则可以完成这些操作,这样可以节约大量的CPU时间。


参考网站:http://www.cplusplus.com/reference/list/list/


****转载请注明出处:http://blog.csdn.net/synapse7/article/details/9750181****

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
【为什么还需要学习C++?】 你是否接触很多语言,但从来没有了解过编程语言的本质?你是否想成为一名资深开发人员,想开发别人做不了的高性能程序?你是否经常想要窥探大型企业级开发工程的思路,但苦于没有基础只能望洋兴叹? 那么C++就是你个人能力提升,职业之路进阶的不二之选。【课程特色】 1.课程共19大章节,239课时内容,涵盖数据结构、函数、类、指针、标准库全部知识体系。2.带你从知识与思想的层面从0构建C++知识框架,分析大型项目实践思路,为你打下坚实的基础。3.李宁老师结合4大国外顶级C++著作的精华为大家推出的《征服C++11》课程。【学完后我将达到什么水平?】 1.对C++的各个知识能够熟练配置、开发、部署;2.吊打一切关于C++的笔试面试题;3.面向物联网的“嵌入式”和面向大型化的“分布式”开发,掌握职业钥匙,把握行业先机。【面向人群】 1.希望一站式快速入门的C++初学者; 2.希望快速学习 C++、掌握编程要义、修炼内功的开发者; 3.有志于挑战更高级的开发项目,成为资深开发的工程师。 【课程设计】 本课程包含3大模块基础篇本篇主要讲解c++的基础概念,包含数据类型、运算符等基本语法,数组、指针、字符串等基本词法,循环、函数、类等基本句法等。进阶篇本篇主要讲解编程中常用的一些技能,包含类的高级技术、类的继承、编译链接和命名空间等。提升篇:本篇可以帮助学员更加高效的进行c++开发,其中包含类型转换、文件操作、异常处理、代码重用等内容。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值