list的简单剖析
来源:互联网 发布:电脑怎么修改淘宝评价 编辑:程序博客网 时间:2024/06/04 18:10
前面介绍了库中的vector,下面来认识下list。主要与vector作比较。
list:带头的双向循环链表。
相较于vector的连续线性空间,list的优势在于每次插入或删除一个元素,就配置或释放一个元素空间。因此,list对于空间的运用有绝对的精准,一点也不浪费,当然实现起来也更复杂,而且,对于任何位置的元素插入或元素移除,list永远是常数时间。
list支持头插,头删,这就是结构带来的优势。但list是依靠指针联系起来的,故此它的访问效率是低于vector的。
#include<iostream>using namespace std;#include<list>void TestList(){ list<int> L; L.push_back(1); L.push_back(2); L.push_back(3); L.push_back(4); list<int>::iterator it1 = L.begin(); while (it1 != L.end()) { cout << *it1 << " "; ++it1; } cout << endl;}int main(){ //TestIterator(); TestList(); system("pause"); return 0;}
同样的list的迭代器是否会有失效的问题呢?
#include<iostream>using namespace std;#include<list>void TestList(){ list<int> L; L.push_back(1); L.push_back(2); L.push_back(3); L.push_back(4); list<int>::iterator it1 = L.begin(); while (it1 != L.end()) { if (*it1 % 2 == 0) { L.erase(it1); } cout << *it1 << " "; ++it1; } cout << endl;}int main(){ TestList(); system("pause"); return 0;}
这样使用迭代器还是会导致程序崩溃。
解决方案
#include<iostream>using namespace std;#include<list>void TestList(){ list<int> L; L.push_back(1); L.push_back(2); L.push_back(3); L.push_back(4); list<int>::iterator it1 = L.begin(); while (it1 != L.end()) { if (*it1 % 2 == 0) { it1 = L.erase(it1); } else { cout << *it1 << " "; ++it1; } } cout << endl;}int main(){ TestList(); system("pause"); return 0;}
在链表中同样提供了size()来求取元素的个数,但是其时间复杂度是O(N)级别的建议不要使用。
阅读全文
0 0
- list的简单剖析
- 【STL】list的简单剖析以及各种函数的实现
- 【STL】list的简单剖析以及各种函数的实现
- List的add方法剖析
- List的add方法剖析
- 简单问题的剖析
- -> * 与 .* 的简单剖析
- vector的简单剖析
- 第一章 Spring的简单剖析
- 关于Eventloopthreatpool的简单剖析
- Linux权限的简单剖析
- List的简单使用
- List的简单使用
- 简单的list使用方法
- 简单的 web List
- list的简单应用
- 简单恶意程序剖析,剖析其所用的AP…
- uC/OS应用的简单剖析
- linux命令
- spring的依赖注入实际上用的是Cglib代理
- docker安装和使用过程中遇到的问题
- oss 罗列Bucket所有Object
- Hadoop-使用MRUnit来写单元测试
- list的简单剖析
- [免下载]Sublime Text 3 (Build 3143) 最新注册码,亲测可用!
- GraphX增加BFS测试用例
- Fiddler实现手机抓包
- 传输层-3、流水机制和滑动窗口协议
- js 适配器模式
- mybatis在xml文件中处理大于号小于号的方法
- jenkins-git下载代码超时
- Git命令大全思维导图