理解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。

posted on 2017-03-16 20:11 wj0816 阅读(...) 评论(...) 编辑 收藏

转载于:https://www.cnblogs.com/wj0816/p/6561358.html

理解list和vector的区别相关推荐

  1. 2020-12-6(从反汇编理解指针和引用的区别)

    这是我10个月前看到的一篇博客吧,感觉分析指针和引用的文章这是我目前见过讲解得最清晰的一篇: 本文主要基于反汇编代码,从初始化.赋值以及取地址三个角度来理解指针和引用的区别. 初始化 写出以下代码并查 ...

  2. LinkedList ArrayList Vector的区别

    LinkedList ArrayList Vector的区别 LinkedList ArrayList Vector详解 LinkedList LinkedList底层结构是双向链表的形式,所以,当查 ...

  3. ArrayList与LinkedList、Vector的区别 HashMap与HashTable、HashSet的区别

    一.ArrayList 和 LinkedList区别: (1)两者都是线程不安全,都实现了Collection接口. (2)数据结构:ArrayList是基于动态数组的数据结构,LinkedList是 ...

  4. 深入理解HashMap和LinkedHashMap的区别

    文章目录 简介 LinkedHashMap详解 插入 访问 removeEldestEntry 总结 深入理解HashMap和LinkedHashMap的区别 简介 我们知道HashMap的变量顺序是 ...

  5. 深入理解HashMap和TreeMap的区别

    文章目录 简介 HashMap和TreeMap本质区别 排序区别 Null值的区别 性能区别 共同点 深入理解HashMap和TreeMap的区别 简介 HashMap和TreeMap是Map家族中非 ...

  6. ArrayList和Vector的区别

    这两个类都实现了List接口(List接口继承了Collection接口),他们都是有序集合,即存储在这两个集合中的元素的位置都是有顺序的,相当于一种动态的数组,我们以后可以按位置索引号取出某个元素, ...

  7. C++中 list与vector的区别

    C++中 list与vector的区别 引用http://www.cnblogs.com/shijingjing07/p/5587719.html C++ vector和list的区别 1.vecto ...

  8. Java-ArrayList和Vector的区别

    这两个类都实现了List接口(List接口继承了Collection接口),他们都是有序集合,即存储在这两个集合中的元素的位置都是有顺序的,相当于一种动态的数组,我们以后可以按位置索引号取出某个元素, ...

  9. [转载] 菜鸟举例理解字节流和字符流区别

    参考链接: Java中的字符流与字节流 Character Stream对比Byte Stream 菜鸟举例理解字节流和字符流区别 按照uft8编码方式存储文档 文档存储路径在D盘下 /** * 按照 ...

  10. C++11介绍之vector::push_back和vector::emplace_back区别

    vector::push_back和vector::emplace_back区别 emplace_back() 和 push_back() 功能上类似,但底层实现机制是不同的.push_back() ...

最新文章

  1. 【新】欢庆网自动搜索请柬console方法,面对多种网站改版的情况
  2. 互联网造车如火如荼,我们错怪贾跃亭了? | 圆桌脱口秀
  3. 虚拟桌面模拟查找点击自绘控件
  4. 2020-11-11(aidl)
  5. Spring Boot 项目瘦身指南,非常实用!
  6. winform通过ListView绑定数据库数据源
  7. java swing web_Java-JFrame-swing嵌套浏览器步骤
  8. MySQL 修改和删除索引
  9. 电脑 linux系统下载官网,红旗Linux操作系统
  10. CSS3 文本阴影 text-shadow属性
  11. Python:用类与对象写一元二次方程计算器中遇到的错误
  12. MPU6050姿态解算——Mahony互补滤波
  13. Node.js单例模式
  14. U盘格式化后容量变小了恢复教程
  15. signature=bf81fe7f4f17ad23bbd6aa8f365d3bc7,【迅雷高端用户入门手册】(第七集)简单分析迅雷崩溃...
  16. velodyne运行Loam_velodyne过程记录
  17. CSS 列表样式(ul)
  18. OSI七层模型的功能及协议
  19. c语言开发安装浏览器,用Visual C++开发简易浏览器
  20. 人生下来就是一个矛盾体

热门文章

  1. SSM-SpringMVC-15:SpringMVC中小论注解式开发之通配符篇
  2. NPM酷库050:xmlbuilder,创建XML文件
  3. idea 错误: -source 1.6 中不支持 diamond 运算符的解决办法
  4. 《数字图像处理》读书笔记:第1章 绪论
  5. 自定义list-style的兼容性问题解决办法
  6. SQL Server数据库简繁体数据混用的问题
  7. 路由器与交换机组网性能的综合对比分析
  8. vue2使用脚手架配置prettier报错:‘prettier/prettier‘: context.getPhysicalFilename is not a function
  9. vue3的语法使用总结api
  10. nslookup java_使用JAVA实现nslookup命令