我是靠谱客的博主 迷人斑马,最近开发中收集的这篇文章主要介绍vector、list、map、set的区别,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

vector

应用场景: 需要经常随机访问且不用经常对中间元素删除插入时使用vector
如果元素是结构或类,最好是将结构或类的指针放入vector中,这样不仅能够节省空间,而且可以避免移动时构造和析构操作
删除元素时采用后面的元素覆盖前面的元素的方法可以提高效率

定义:是动态数组,在堆中分配内存,元素连续存放,有保留内存,如果减少大小后,内存也不会释放;如果新值大于当前大小时才会重新分配内存。拥有一段连续的内存空间,并且起始地址不变,因此能够非常好的支持随机存取,即[]操作符,但是由于它的内存空间是连续的,所以在头部和中间进行插入和删除操作会造成内存块的拷贝,另外,当该数组的内存空间不够时,需要重新申请一块足够大得内存并且进行内存的拷贝,这些都大大的影响了vector的效率。
对头部和中间进行添加删除元素操作需要移动内存,如果你得元素是结构或类,那么移动的同时还会进行构造和析构操作,所以性能不高
对任何元素的访问时间都是O(1)
,所以常用来保存需要经常进行随机访问的内容,并且不需要经常对中间元素进行添加删除操作
属性与string差不多,同样可以使用capacity看当前保留的内存,使用swap来减少它使用的内存,如push_back 1000个元素,capacity返回值为16384
对最后元素操作最快(在后面添加删除元素最快),此时一般不需要移动内存,只有保留内存不够时才需要

list

定义:双向链表,元素也存放在堆中,每个元素都是放在一块内存中,他的内存空间可以是不连续的,通过指针来进行数据的访问,这个特点使得它的随机存取变得非常没有效率,因此它没有提供[]操作符的重载。但是由于链表的特点,它可以很有效率的支持任意地方的删除和插入操作。

特点: list没有空间预留习惯,所以每分配一个元素都会从内存中分配,每删除一个元素都会释放它占用的内存.
list在哪里添加删除元素性能都很高,不需要移动内存,当然也不需要对每个元素都进行构造与析构了,所以常用来做随机操作容器.
但是访问list里面的元素时就开始和最后访问最快
访问其它元素都是O(n) ,所以如果需要经常随机访问的话,还是使用其它的好
总结
如果你喜欢经常添加删除大对象的话,那么请使用list
要保存的对象不大,构造与析构操作不复杂,那么可以使用vector代替
list<指针>完全是性能最低的做法,这种情况下还是使用vector<指针>好,因为指针没有构造与析构,也不占用很大内存

set 和 map的解释

set 和 map 可以做对比
相同点: 他们都是无序的保存元素,只是通过它提供的借口对里面的元素进行访问,底层都是采用红黑树实现
不同点: set集合,用来判断某一个元素是不是在一个组里面,使用的比较少
map映射,相当于字典,把一个值映射成另一个值,可以创建字典

优点: 可以使用容器, 时间复杂度O(logN)
缺点: 每次插入值的时候,都需要调整红黑树,效率有一定影响

最后

以上就是迷人斑马为你收集整理的vector、list、map、set的区别的全部内容,希望文章能够帮你解决vector、list、map、set的区别所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(47)

评论列表共有 0 条评论

立即
投稿
返回
顶部