为什么80%的码农都做不了架构师?>>>   

在STL中基本容器有: string、vector、list、deque、set、map

set 和map都是无序的保存元素,只能通过它提供的接口对里面的元素进行访问

set:集合, 用来判断某一个元素是不是在一个组里面,使用的比较少
map:映射,相当于字典,把一个值映射成另一个值,如果想创建字典的话使用它好了

string、 vector、list、deque、set 是有序容器
1.string

string 是basic_string<char> 的实现,在内存中是连续存放的.为了提高效率,都会有保留内存,如string s= "abcd",这时s使用的空间可能就是255, 当string再次往s里面添加内容时不会再次分配内存.直到内容>255时才会再次申请内存,因此提高了它的性能.
当内容>255 时,string会先分配一个新内存,然后再把内容复制过去,再复制先前的内容.

对string的操作,如果是添加到最后时,一般不需要 分配内存,所以性能最快;
如果是对中间或是开始部分操作,如往那里添加元素或是删除元素,或是代替元素,这时需要进行内存复制,性能会降低.

如 果删除元素,string一般不会释放它已经分配的内存,为了是下次使用时可以更高效.

由于string会有预保留内存,所以如果大量使 用的话,会有内存浪费,这点需要考虑.还有就是删除元素时不释放过多的内存,这也要考虑.

string中内存是在堆中分配的,所以串的长 度可以很大,而char[]是在栈中分配的,长度受到可使用的最大栈长度限制.

如果对知道要使用的字符串的最大长度,那么可以使用普通的 char[],实现而不必使用string.
string用在串长度不可知的情况或是变化很大的情况.

如果string已经经历 了多次添加删除,现在的尺寸比最大的尺寸要小很多,想减少string使用的大小,可以使用:
string s = "abcdefg";
string y(s); // 因为再次分配内存时,y只会分配与s中内容大一点的内存,所以浪费不会很大
s.swap(y); // 减少s使用的内存

如 果内存够多的话就不用考虑这个了

capacity是查看现在使用内存的函数
大家可以试试看string分配一个一串后 的capacity返回值,还有其它操作后的返回值

2.vector

vector就是动态数组.它也是在堆中分配内 存,元素连续存放,有保留内存,如果减少大小后内存也不会释放.如果新值>当前大小时才会再分配内存
对最后元素操作最快(在后面添加删除 最快 ), 此时一般不需要移动内存,只有保留内存不够时才需要
对中间和开始处进行添加删除元素操作需要移动内存,如果你的元素是结构或是类,那么移动的同时还会进行构造和析构操作,所以性能不高(最好将结构或类的指针放入vector中,而不是结构或类本身,这样可以避免移动时 的构造与析构)。
访问方面,对任何元素的访问都是O(1),也就是是常数的,所以vector常用来保存需要经常进行随机访问的内 容,并且不需要经常对中间元素进行添加删除操作.

相比较可以看到vector的属性与string差不多,同样可以使用capacity 看当前保留的内存,使用swap来减少它使用的内存.

总结
需要经常随机访问请用vector

3.list

list 就是链表,元素也是在堆中存放,每个元素都是放在一块内存中
list没有空间预留习惯,所以每分配一个元素都会从内存中分配,每删除一个元素都 会释放它占用的内存,这与上面不同,可要看好了

list在哪里添加删除元素性能都很高,不需要移动内存,当然也不需要对每个元素都进行构 造与析构了,所以常用来做随机操作容器.
但是访问list里面的元素时就开始和最后访问最快
访问其它元素都是O(n) ,所以如果需要经常随机访问的话,还是使用其它的好

总结
如果你喜欢经常添加删除大对象的话,那么请使用list
要保存的 对象不大,构造与析构操作不复杂,那么可以使用vector代替
list<指针>完全是性能最低的做法,这种情况下还是使用 vector<指针>好,因为指针没有构造与析构,也不占用很大内存

4.deque

双端队列, 也是在堆中保存内容的.它的保存形式如下:

[堆1]
...
[堆2]
...
[堆3]

每个 堆保存好几个元素,然后堆和堆之间有指针指向,看起来像是list和vector的结合品,不过确实也是如此
deque可以让你在前面快速地添加 删除元素,或是在后面快速地添加删除元素,然后还可以有比较高的随机访问速度

vector是可以快速地在最后添加删除元素,并可以快速地 访问任意元素
list是可以快速地在所有地方添加删除元素,但是只能快速地访问最开始与最后的元素
deque在开始和最后添加元素都一样 快,并提供了随机访问方法,像vector一样使用[]访问任意元素,但是随机访问速度比不上vector快,因为它要内部处理堆跳转
deque 也有保留空间.另外,由于deque不要求连续空间,所以可以保存的元素比vector更大,这点也要注意一下.还有就是在前面和后面添加元素时都不需要 移动其它块的元素,所以性能也很高

转载于:https://my.oschina.net/gddyl/blog/113732

STL中基本容器有: string、vector、list、deque、set、map相关推荐

  1. 【C++ STL学习笔记】C++ STL序列式容器(array,vector,deque,list)

    文章目录 C++ STL容器是什么? 迭代器是什么,C++ STL迭代器(iterator)用法详解 迭代器类别 迭代器的定义方式 C++序列式容器(STL序列式容器)是什么 容器中常见的函数成员 C ...

  2. C++基础--STL基本容器string,vector,list,deque,map

    在STL中基本容器有: string.vector.list.deque.set.map set 和map都是无序的保存元素,只能通过它提供的接口对里面的元素进行访问 set:集合, 用来判断某一个元 ...

  3. STL 中的容器们(四)

    STL 中的容器们 for (int i = 0; i < coll.size()-1; ++i){... } 上述代码的写法,coll.size()-1 语句是会出问题的,STL 的所有容器的 ...

  4. stl中各种容器的自定义比较函数

    class elem { public:elem();elem(int aa):a(aa){} public:int a;int getA(){return a;} };class elem1 { p ...

  5. 算法求解中的变量、数组与数据结构(STL 中的容器)

    本质上算法都是对数据的操作,没有数据,没有存储数据的容器和组织方式,算法就是无源之水无本之木,就是巧妇也难为无米之炊.算法是演员,变量.数组.容器等就是舞台, 然后整个算法的处理流程,都是针对这些数据 ...

  6. STL 中的容器们 (二)

    STL 中的容器们 容器最后一个元素的迭代器 我们知道容器: .begin():第一个元素coll[0]的迭代器 .end():最后一个元素之前的元素的迭代器 所以容器最后一个元素的迭代器为:coll ...

  7. C++ STL : 模拟实现STL中的容器适配器stack和queue

    目录 什么是容器适配器 stack stack的文档介绍-(来自cplusplus) stack的实现 queue queue的文档介绍-(来自cplusplus) queue的实现 什么是容器适配器 ...

  8. php的set 容器,关于STL中set容器的一些总结

    1.关于set C++ STL 之所以得到广泛的赞誉,也被很多人使用,不只是提供了像vector, string, list等方便的容器,更重要的是STL封装了许多复杂的数据结构算法和大量常用数据结构 ...

  9. C++ STL容器——序列式容器(array、vector、deque、list)

    概述 1.C++ STL的容器分为三种,序列式容器,关联式容器,无序式容器,这里先说说常用的序列式容器. 2.array,vector,deque,list,forward_list这几种都是序列式容 ...

最新文章

  1. 一个项目可以有多个源代码路径
  2. 从“人肉扩缩容”到云原生容量,90 后程序员的进化
  3. python是什么系统_最齐全、最系统的python教程
  4. Weblogic配置故障转移
  5. Week04-面向对象设计与继承
  6. 跨平台 C/C++ memcached 客户端 memcacheclient 介绍
  7. exports、module.exports和export、export default到底是咋回事
  8. cad画1000线太长了_为什么你画CAD图没别人快?今天就教你几招!
  9. mysql 中某个字段相同的数据拼接起来
  10. 查看屏幕大小_疑似“iPhone 12” 的OLED屏幕组件泄露
  11. javamelody监控java项目_使用javamelody监控javaEE
  12. 前端为什么有的接口明明是成功回调却执行了.catch失败回调_前端知识整理
  13. VPX信号处理板学习资料第274篇:基于XC7V690T的3U VPX信号处理板
  14. Kafka Eagle V1.3.4更新预览
  15. PYTHON-音视频合并方法
  16. 基于OpenCV的土壤裂缝分割系统
  17. ipad无法充电怎么办_Ipad显示不在充电怎么办
  18. ts16949 软件开发流程图_ts16949开发流程图
  19. 10款方便的在线文件格式转换工具网站。
  20. NAXX Demo4_GZQ_02

热门文章

  1. 心得丨一位资深程序员大牛给予Java初学者的学习路线建议
  2. 多巴胺如何驱使我们克服复杂情况、逆境、情绪, 让我们掌控周遭的环境的
  3. 人类如何接近“宇宙无限”?微积分的力量无处不在
  4. 未来30年,这20项技术将颠覆人类生活
  5. 成立 5 周年:一文览尽 Facebook 人工智能研究院历年重要成果
  6. 自动驾驶关键技术报告:惯性导航和背后的芯片大战
  7. 云计算行业报告:2018, 风起云涌
  8. Google Brain 团队的研究方法
  9. 比杠精网友更可怕的,是懂王同事
  10. 【讲师团招募令】14场线上万人社区大会 邀你来分享