理解list和vector的区别
原文:http://genwoxuevc.blog.51cto.com/1852984/503337
vector和数组类似,它拥有一段连续的内存空间,并且起始地址不变,因此它能非常好的支持随机存取(即使用[]操作符访问其中的元素),但由于它的内存空间是连续的,所以在中间进行插入和删除会造成内存块的拷贝(复杂度是O(n)),另外,当该数组后的内存空间不够时,需要重新申请一块足够大的内存并进行内存的拷贝。这些都大大影响了vector的效率。
list是由数据结构中的双向链表实现的,因此它的内存空间可以是不连续的。因此只能通过指针来进行数据的访问,这个特点使得它的随机存取变的非常没有效率,需要遍历中间的元素,搜索复杂度O(n),因此它没有提供[]操作符的重载。但由于链表的特点,它可以以很好的效率支持任意地方的删除和插入。
由于list和vector上面的这些区别,因此list::iterator与vector::iterator也有一些不同。请看下面的例子:
#include <iostream>
#include <vector>
#include <list>
using namespace std;
int main( void )
{
vector<int> v;
list<int> l;
for (int i=0; i<8; i++) //往v和l中分别添加元素
{
v.push_back(i);
l.push_back(i);
}
cout << "v[2] = " << v[2] << endl;
//cout << "l[2] = " << l[2] << endl; //编译错误,list没有重载[]
cout << (v.begin() < v.end()) << endl;
//cout << (l.begin() < l.end()) << endl; //编译错误,list::iterator没有重载<或>
cout << *(v.begin() + 1) << endl;
vector<int>::iterator itv = v.begin();
list<int>::iterator itl = l.begin();
itv = itv + 2;
//itl = itl + 2; //编译错误,list::iterator没有重载+
itl++;itl++; //list::iterator中重载了++,只能使用++进行迭代访问。
cout << *itv << endl;
cout << *itl << endl;
return 0;
}
由于vector拥有一段连续的内存空间,能非常好的支持随机存取,因此vector<int>::iterator支持“+”、“+=”、“<”等操作符。
而list的内存空间可以是不连续,它不支持随机访问,因此list<int>::iterator则不支持“+”、“+=”、“<”等操作符运算,因此代码20、26行会有编译错误。只能使用“++”进行迭代,例如代码27行,使用两次itl++来移动itl。还有list也不支持[]运算符,因此代码18行出现编译错误。
总之,如果需要高效的随即存取,而不在乎插入和删除的效率,使用vector;如果需要大量的插入和删除,而不关心随即存取,则应使用list。
答案:
vector拥有一段连续的内存空间,因此支持随机存取,如果需要高效的随即存取,而不在乎插入和删除的效率,使用vector。
list拥有一段不连续的内存空间,因此支持随机存取,如果需要大量的插入和删除,而不关心随即存取,则应使用list。
转载于:https://www.cnblogs.com/wj0816/p/6561358.html
理解list和vector的区别相关推荐
- 2020-12-6(从反汇编理解指针和引用的区别)
这是我10个月前看到的一篇博客吧,感觉分析指针和引用的文章这是我目前见过讲解得最清晰的一篇: 本文主要基于反汇编代码,从初始化.赋值以及取地址三个角度来理解指针和引用的区别. 初始化 写出以下代码并查 ...
- LinkedList ArrayList Vector的区别
LinkedList ArrayList Vector的区别 LinkedList ArrayList Vector详解 LinkedList LinkedList底层结构是双向链表的形式,所以,当查 ...
- ArrayList与LinkedList、Vector的区别 HashMap与HashTable、HashSet的区别
一.ArrayList 和 LinkedList区别: (1)两者都是线程不安全,都实现了Collection接口. (2)数据结构:ArrayList是基于动态数组的数据结构,LinkedList是 ...
- 深入理解HashMap和LinkedHashMap的区别
文章目录 简介 LinkedHashMap详解 插入 访问 removeEldestEntry 总结 深入理解HashMap和LinkedHashMap的区别 简介 我们知道HashMap的变量顺序是 ...
- 深入理解HashMap和TreeMap的区别
文章目录 简介 HashMap和TreeMap本质区别 排序区别 Null值的区别 性能区别 共同点 深入理解HashMap和TreeMap的区别 简介 HashMap和TreeMap是Map家族中非 ...
- ArrayList和Vector的区别
这两个类都实现了List接口(List接口继承了Collection接口),他们都是有序集合,即存储在这两个集合中的元素的位置都是有顺序的,相当于一种动态的数组,我们以后可以按位置索引号取出某个元素, ...
- C++中 list与vector的区别
C++中 list与vector的区别 引用http://www.cnblogs.com/shijingjing07/p/5587719.html C++ vector和list的区别 1.vecto ...
- Java-ArrayList和Vector的区别
这两个类都实现了List接口(List接口继承了Collection接口),他们都是有序集合,即存储在这两个集合中的元素的位置都是有顺序的,相当于一种动态的数组,我们以后可以按位置索引号取出某个元素, ...
- [转载] 菜鸟举例理解字节流和字符流区别
参考链接: Java中的字符流与字节流 Character Stream对比Byte Stream 菜鸟举例理解字节流和字符流区别 按照uft8编码方式存储文档 文档存储路径在D盘下 /** * 按照 ...
- C++11介绍之vector::push_back和vector::emplace_back区别
vector::push_back和vector::emplace_back区别 emplace_back() 和 push_back() 功能上类似,但底层实现机制是不同的.push_back() ...
最新文章
- 【新】欢庆网自动搜索请柬console方法,面对多种网站改版的情况
- 互联网造车如火如荼,我们错怪贾跃亭了? | 圆桌脱口秀
- 虚拟桌面模拟查找点击自绘控件
- 2020-11-11(aidl)
- Spring Boot 项目瘦身指南,非常实用!
- winform通过ListView绑定数据库数据源
- java swing web_Java-JFrame-swing嵌套浏览器步骤
- MySQL 修改和删除索引
- 电脑 linux系统下载官网,红旗Linux操作系统
- CSS3 文本阴影 text-shadow属性
- Python:用类与对象写一元二次方程计算器中遇到的错误
- MPU6050姿态解算——Mahony互补滤波
- Node.js单例模式
- U盘格式化后容量变小了恢复教程
- signature=bf81fe7f4f17ad23bbd6aa8f365d3bc7,【迅雷高端用户入门手册】(第七集)简单分析迅雷崩溃...
- velodyne运行Loam_velodyne过程记录
- CSS 列表样式(ul)
- OSI七层模型的功能及协议
- c语言开发安装浏览器,用Visual C++开发简易浏览器
- 人生下来就是一个矛盾体
热门文章
- SSM-SpringMVC-15:SpringMVC中小论注解式开发之通配符篇
- NPM酷库050:xmlbuilder,创建XML文件
- idea 错误: -source 1.6 中不支持 diamond 运算符的解决办法
- 《数字图像处理》读书笔记:第1章 绪论
- 自定义list-style的兼容性问题解决办法
- SQL Server数据库简繁体数据混用的问题
- 路由器与交换机组网性能的综合对比分析
- vue2使用脚手架配置prettier报错:‘prettier/prettier‘: context.getPhysicalFilename is not a function
- vue3的语法使用总结api
- nslookup java_使用JAVA实现nslookup命令