C++面试题:list和vector有什么区别?

考点:理解list和vector的区别

出现频率:★★★★

解析

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

C++面试题:list和vector有什么区别?相关推荐

  1. C++面试题:list和vector有什么区别

    C++面试题:list和vector有什么区别? 考点:理解list和vector的区别 出现频率:★★★★ 解析: vector和数组类似,它拥有一段连续的内存空间,并且起始地址不变,因此它能非常好 ...

  2. ArrayList和Vector有什么区别?

    本文翻译自:What are the differences between ArrayList and Vector? 两个数据结构ArrayList和Vector之间有什么区别,你应该在哪里使用它 ...

  3. 【蓝桥杯Java_C组·从零开始卷】第八节、集合——list详解(ArrayList、 LinkedList 和 Vector之间的区别)

    ArrayList. LinkedList 和 Vector之间的区别 ArrayList. LinkedList 和 Vector都实现了List接口,是List的三种实现,所以在用法上非常相似.他 ...

  4. 面试题:ConcurrentHashMap 和 Hashtable 的区别

    面试题:ConcurrentHashMap 和 Hashtable 的区别 关键词 1.8ConcurrentHashMap 只锁 首节点 ConcurrentHashMap 和 Hashtable ...

  5. (87)FPGA面试题-同步FIFO与异步FIFO区别?异步FIFO代码设计

    1.1 FPGA面试题-同步FIFO与异步FIFO区别?异步FIFO代码设计 1.1.1 本节目录 1)本节目录: 2)本节引言: 3)FPGA简介: 4)FPGA面试题-同步FIFO与异步FIFO区 ...

  6. (34)FPGA面试题FPGA和CPLD有哪些区别

    1.1 FPGA面试题FPGA和CPLD有哪些区别 1.1.1 本节目录 1)本节目录: 2)本节引言: 3)FPGA简介: 4)FPGA面试题FPGA和CPLD有哪些区别: 5)结束语. 1.1.2 ...

  7. matlab里的scalar,scalar_scalar与vector之间的区别

    scalar与vector之间的区别 有些物理量,既要由数值大?包括有关的单位),又要由方向才能完全确定.这些量之间的运算并不遵循一般的代数法则,而遵循特殊的运算法则.这样的量叫做物理矢量. 有些物理 ...

  8. 经典面试题 HTTPS和HTTP有什么区别?

    经典面试题 HTTPS和HTTP有什么区别? 解决面试题,斩获心仪的 Offer 文章目录 经典面试题 HTTPS和HTTP有什么区别? 一.HTTPS和HTTP是什么? 二.HTTPS和HTTP有什 ...

  9. 大数据技术之_31_Java 面试题_02_== 和 equals 有什么区别 + String 相关 + 多态 + 传值 + static 加载机制 + 线程

    大数据技术之_31_Java 面试题_02 1.== 和 equals 有什么区别? 2.为什么需要同时覆写 hashCode 和 equals 方法? 3.为什么用 eclipse 重写 hashC ...

最新文章

  1. php循环方法实现先序、中序、后序遍历二叉树
  2. 超棒的跨浏览器纯CSS动画实现 - Animate.css
  3. OpenCV无缝克隆不带GUI的模块的实例(附完整代码)
  4. SQL SERVER 2014 各个版本支持的功能
  5. pandas之get_dummies
  6. 如何建设一个开源图形引擎的文档网站
  7. Python环境搭建教程
  8. dell n5110 触摸板驱动
  9. java 6 17 32_java学习class6(1)
  10. 装mysql电脑网卡不见了_网络适配器不见了怎么办【解决方法】
  11. Mumble安装部署教程
  12. Mac下安装Mavenidea配置maven
  13. Python批量删除文件名中带小括号数字(1)(2)(3)...
  14. pycharm查找替换快捷键
  15. 利用FTP将Linux文件备份到Windows
  16. performance性能
  17. window浏览器被劫持如何修复,hao123,2345 等
  18. 外企做开发,爽吗?(HSBC篇)
  19. python 05 字典
  20. mount 中文man(转)

热门文章

  1. oracle创建触发器
  2. 数据库导出成txt文件
  3. MySQL之存储过程和函数
  4. ubuntu16.04 内核源码编译
  5. form图片上传遇到错误
  6. 引导页的圆点滑动效果
  7. delete table 和 truncate table
  8. 在线CSV转Excel工具
  9. C# 合并多种格式文件为PDF
  10. 程序员应知道这十大面向对象设计原则