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。

转载于:https://www.cnblogs.com/wuchanming/p/3728447.html

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. 如何修改 远程桌面的 默认端口号 3389
  2. 《Cisco ASA设备使用指南》一2.8 Cisco ASA吉比特以太网模块
  3. APACHE 安装出错 configure: error: Cannot use an external APR with the bundled APR-util
  4. hihoCoder - 1082 - 然而沼跃鱼早就看穿了一切 (字符串处理!!)
  5. windows计划任务启动bat执行java文件
  6. [ARM-assembly]-全局变量/静态全局变量/初始化/未初始化变量的存放位置分析
  7. QT的QScopedPointer类的使用
  8. 关于splice()方法,slice() 、split()方法讲解,reverse()方法、replace()方法
  9. 安装scapy遇到的问题
  10. 利用pre-compiled headers技术以加速编译速度(一)
  11. C++函数指针和类成员函数指针
  12. windows下批量杀死进程
  13. 【WPF-HelixToolkit】史陶比尔RX160L 机器人仿真器源码学习
  14. 房天下搜房网二手房_【杭州二手房|杭州二手房出售】 - 杭州房天下
  15. python中screen用法_screen的用法
  16. java 私有云_[原创]私有云中实现以应用程序为中心的PaaS
  17. 科研突破:非宁静无以致远
  18. 《金融的本质》书中的精髓:金融危机是如何产生的?以及美联储是如何应对金融危机的?
  19. 高德地图,坐标转换,自定义导航路线
  20. [SV]SystemVerilog 断言(SVA)检查器库(OVL)

热门文章

  1. json过滤特殊字符
  2. 提高团队整体能力-同一片天“技术交流会”
  3. illegal instruction错误
  4. 现代永磁电机交流伺服系统_【每日文献】2020-002 永磁同步电机模糊自整定自适应积分反步控制...
  5. 0基础怎么学python10010基础怎么学python_0基础的人如何入门 Python ?Python难么?
  6. 适配器模式——类适配器模式,对象适配器模式
  7. 软件设计原则——里氏代换原则
  8. ApplicationContext||ApplicationContext与BeanFactory的区别||SpringContextUtil类的作用
  9. 转载:python3 安装pycrypto
  10. 获得程序运行结果的返回值