在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更大,这点也要注意一下.还有就是在前面和后面添加元素时都不需要移动其它块的元素,所以性能也很高

每个容器对数据操作的方法基本类似,下面给出List 操作数据的Demo

// TimerTest.cpp : Using STL functions LIST
//

#include "stdafx.h"
#include <iostream>
#include <string>
#include <vector>
#include <list>
#include <algorithm>
#include <iterator>
using namespace std;int _tmain(int argc, _TCHAR* argv[])
{list<int> one(5 , 2);int stuff[5] = {1, 2, 4, 8, 6};list<int> two;two.insert(two.begin(),stuff,stuff+5);int more[6] = {6, 4, 6, 2, 4, 5};list<int> three( two );three.insert(three.end(), more, more + 6);cout<<"List one:";ostream_iterator<int,char> out(cout, " ");copy(one.begin(), one.end(), out);cout<<endl;cout<<"List two:";copy(two.begin(),two.end(),out);cout<<endl;cout<<"List three:";copy(three.begin(),three.end(),out);cout<<endl;three.remove(2);cout<<endl<<"List three minus 2s\t";copy(three.begin(),three.end(),out);three.splice(three.begin(),one);cout<<"\nList three after splice:";copy(three.begin(),three.end(),out);cout<<"\n List one:";copy(one.begin(),one.end(),out);three.unique();cout<<"\n List three after unique:";copy(three.begin(),three.end(),out);three.sort();three.unique();cout<<"\nList three after unique & sort:";copy(three.begin(),three.end(),out);two.sort();three.merge(two);cout<<"\n List three after merge two:";copy(three.begin(),three.end(),out);cout<<"\nList two after merge with three:";copy(two.begin(),two.end(),out);three.unique();cout<<"\n List three after unique:";copy(three.begin(),three.end(),out);system("pause");
}

转载于:https://www.cnblogs.com/kingdom_0/articles/2565434.html

C++基础--STL基本容器string,vector,list,deque,map相关推荐

  1. 【C++篇】STL常见容器String的模拟实现

    准备 博主:大大怪先森(记得关注哦!) 编程环境:vs2013 所示代码:码源 文章目录 准备 前言 一.标准库中的tring类 1.了解类 2.string类的常见接口 2.1 string类对象的 ...

  2. C++学习笔记(STL篇)string vector迭代器 stack queue

    字符串基本操作 初始化string对象的方式: string s1 默认初始化,s1是一个空串 string s2(s1) s2是s1的副本 string s2 = s1 等价于s2(s1),s2是s ...

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

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

  4. 容器删除元素后迭代器失效_STL 4: STL之容器:选择时机,删除元素,迭代器失效...

    一. 种类: 标准STL序列容器:vector.string.deque和list. 标准STL关联容器:set.multiset.map和multimap. 非标准序列容器slist和rope.sl ...

  5. C++常用的容器(vector、set、list、map)

    C++ STL中最基本以及最常用的类或容器无非就是以下几个: string vector set list map 下面就依次介绍它们,并给出一些最常见的最实用的使用方法,做到快速入门. string ...

  6. STL各容器成员对比表

    来源:http://www.cplusplus.com 一转:http://www.cnblogs.com/fangyukuan/archive/2010/09/21/1832675.html 标准S ...

  7. 【读书笔记】【Effective STL】容器

    第 1 条:慎重选择容器类型. C++ 中不同的容器分类如下:[标准 or 非标准][STL or 非 STL][序列 or 关联] 标准 STL 序列容器:vector.string.deque.l ...

  8. Effective STL之容器

    一.慎重选择容器类型 1.容器分类 标准STL序列容器:vector,string,deque,list: 标准STL关联容器:set,multiset,map,multimap: 非标准关联容器(基 ...

  9. STL vector list deque区别与实现

    1 vector 向量 相当于一个数组     在内存中分配一块连续的内存空间进行存储.支持不指定vector大小的存储.STL内部实现时,首先分配一个非常大的内存空间预备进行存储,即capacitu ...

最新文章

  1. C++知识点1——基础
  2. std::map char*做key
  3. CRMEB系统开发文档
  4. 百度网站打不开了,百度被黑了?最新证实:百度遭黑客劫持,手段类似于12月被劫持的twitter(截图)...
  5. xp系统设置锁定计算机,系统锁定时不关机的诀窍 给XP系统关闭计算机再加一把锁...
  6. 【转】WPF之路-常用布局控件一
  7. 【转载】TableLayout表格布局详解
  8. linux 环境变量详解,Linux 环境变量详解及实例
  9. Python学习笔记1:数据模型和特殊方法(魔术方法)
  10. bay——RAC_ASM ORA-15001 diskgroup DATA does not exist or is not mounted.docx
  11. oneno浏览器插件_onenote 插件-onenote clipper for chrome下载 v2.1.3官方版--pc6下载站
  12. 三方集成 - 友盟分享总结
  13. 自动网络设计(NAS)Randomly Wired Neural Networks 何凯明团队
  14. 刑事实务办案中疑难问题
  15. 复爱合缘风波后高管调整:命庄海为总裁 王靖为CFO
  16. Oracle 行转列的坑
  17. 作业---舞台剧 前端页面显示
  18. linux卸载teamviewer,ubuntu 16.04 desktop + server LTS - TeamViewer 软件彻底卸载
  19. 在 WPS Word中成功使用zetero
  20. 概率分布,独立同分布在图像分类与检测中到底代表什么?

热门文章

  1. Terracotta Express Model 和 Terracotta Customized Model
  2. 手把手教你用Scrapy爬取知乎大V粉丝列表
  3. python平均数 中位数函数_R和python语言如何求平均值,中位数和众数
  4. 领导看了我写的关闭超时订单,让我出门左转!
  5. 刚出道的黑客搞瘫美国输油管道!他们还边搞钱边捐款
  6. 老板:再用Log4j就收拾东西回家吧!
  7. PaaS中OpenShift持久化存储的管理实践
  8. 【技术文档】JEECG整合JXLS步骤与开发
  9. 两台windows服务器----SVN的迁移
  10. Linux多线程实践(9) --简单线程池的设计与实现