list浅谈
前言
- 一般面试的时候很喜欢问到STL中的vector和list有什么区别, 所以这篇文章在讲list的时候会偶尔和vector进行一些对比
list概述
- list和vector不同, vector是连续的线性空间, vector的插入和删除元素伴随着大量的元素移动, 无法做到常数时间复杂度
- list是一个环状双向链表, 对于链表的操作大家都清楚,在存储空间中不一定是连续存在的,插入和删除元素的时间可以做到常数级别
list迭代器
- vector的迭代器是重载实现了+, +=等符号的
- list有++, --, 但是没有实现+, +=, 这点需要注意
- vector在插入元素的时候有可能会导致空间的重新配置, 原来的迭代器会有可能会失效
- 但是list的插入操作不会导致迭代器的失效, 这也是list和vector的另一个区别所在
list方法
- vector没有push_front(), pop_front()等方法, list是有的
- list和vector一样都是用insert实现push_xxx操作的
- list之中具有很多vector之中没有的方法, 比方说merge等等
- list之中无法使用泛型算法之中的sort, 即algorithm之中的sort方法, 因为algorithm的sort只能接收RandomAccessIterator, 所以list自己内部实现了sort方法
- vector可以使用algorithm之中的sort方法
备注
- list之中的merge方法可以在这个面试题 —— 合并2个递增链表 —— 之中起到很好的功效
- 使用方法是: 先调用sort, 再调用merge, 这样链表就成功合并好了