STL容器小结:vector,set,string,map(C++)

今天分享一下STL容器的学习总结,下面是知识结构图:

可以先对这四个容器有一个大致的了解和把握。

vector简单理解成 变长数组;

set理解为 集合;

string理解为 字符串;

map理解为 映射。

然后主要是它们的用法(常用操作和函数)

首先使用这四种容器都需要添加相应的头文件#include <容器名>和using namespace std;语句。

其中vector和string用法相似,set和map用法相似。(好了,发现这相似的连字母个数都一样,实在是个巧合)

1.访问

vector和string的访问方式都有两种,第一种是直接下标访问,第二种是用迭代器访问,且这两个容器的迭代器都可以加整数。(只需要理解迭代器类似于指针就行了)

set和map都只能通过迭代器的方式进行访问,且这两个容器的迭代器都不能加整数。

vector,string,set,map都可以使用begin(),end()迭代器指向容器的第一个元素和最后一个元素的下一个地址(这个地址什么都不放)。

2.大小

vector,string,set,map都有size()函数可以返回容器的元素个数。主要size()返回值是一个无符号数。此外,string还有length()函数可以返回字符个数,用法和size差不多。

3.清空

vector,string,set,map都有clear()函数用于将容器清空。

4.查找

vector没什么特别的。

string的查找主要有两种,一种是知道子串内容查找下标,使用find(str),返回子串第一次出现时的下标,失配时返回string::npos(只需要知道它是一个常数,对应int型的-1,对应无符号整数的最大值即可)。另一种是知道子串下标和长度查找子串内容,使用substr(pos,len),返回pos处开始长度为len的子串。

set和map的查找类似,使用find(x),返回对应元素的迭代器,失配时返回s.end()。其中对set容器 x参数为要查找的元素值value, 而对map容器 x参数为要查找的键值key。

5.插入

vector的插入操作主要有两种,一种是直接在末尾插入,使用push_back(x);另一种是在指定位置插入,使用insert(it,x);

string的插入操作主要是插入字符串,也主要有3种方式,但其中两种方式都是使用insert函数。一种是使用下标和字符串作为参数,即insert(pos,str);另一种是使用迭代器作为参数,即insert(it,it2,it3)。另外,第三种方式就是直接+,利用字符串的拼接,将另一字符串拼接在指定字符串的开头前或结尾后。

set的插入操作主要有一种,直接插入就行,不需要指定位置,因为set会自动升序排列且唯一,使用insert函数只需要一个参数即插入值,即insert(x)。

map容器的插入操作也主要有一种,就是直接赋值(是不是很简单),即mp[key] = value即完成插入。

6.删除

vector容器的删除可以分为单个元素的删除和区间元素的删除。首先,对于单个元素的删除,有两种,一种是直接删除末尾元素,使用pop_back()函数(注意没有参数);另一种是删除指定位置地原宿,使用erase函数,即erase(it)。另外,如果要删除一个区间的所有元素(注意是左闭右开区间),也是使用erase函数,即erase(it1,it2)。

string容器的删除也可以分为单个元素的删除和区间元素的删除。首先,对于单个元素的删除,有两种方法,但都是使用erase函数,只是参数不同,一种是erase(it);另一种是erase(pos)。此外,如果要删除左闭右开区间的所有元素,也是使用erase,即erase(it1,it2)或者erase(pos,len)。

set容器的删除:

<1>删除单个元素:1.erase(it); 2.erase(value)。

<2>删除区间元素(左闭右开):erase(it1,it2)。

map容器的删除:

<1>删除单个元素:1.erase(it);2.erase(key)。

<2>删除区间元素(左闭右开):erase(it1,it2)。

7.替换

替换操作常见于string容器。对于string容器,要将指定子串替换为另一字符串,可以使用replace函数,即replace(pos,len,str2)或replace(it1,it2,str2)。

8.比较

比较操作常见于vector和string容器,直接比较即可,>,<,==,>=,<=等(字典序)。

最后,我总结了几个要注意的点:

1.迭代器之间只能比较大小,只能判断是否等于。如使用it != s.end();

2.使用string容器输入输出一般使用cin,cout,实在需要使用printf语句则可以先使用c_str函数将string容器转换为字符数组,如string s; printf("%s", s.c_str());

3.我发现一个规律,一般.h头文件不需要和using namespace std;语句配套使用,如#include <string.h>; 而非.h文件一般需要和using namespace std;语句配套使用,如#include <string> (注意-.h文件等价于c-文件,如<math.h>等价于<cmath>。注意<string.h>和<string>不是同一个头文件,前者和字符数组的相关操作有关,后者和string容器的相关操作有关)

4.对于map容器如,map<char,int> mp;其中的char和int似乎只能是用cin,cout进行输入输出,否则...later~(反正我用scanf和printf进行输入输出处理map容器时给我显示答案错误)。(我推测可能的原因是map将这些类型都是借助字符串来处理的吧)

5.map定义时的两个类型名可以是任意基本数据类型,也可以是结构体类型,还可以是任意容器,唯独不能是普通数组,如字符数组char a[50]。

6.数字很大时可以当作字符串来处理。

7.set和map值唯一,这里map是指键值唯一。插入相同值会覆盖,这里map是指插入相同键值,后面的会覆盖掉前面的。(set和map内部是使用红黑树实现的(一种自平衡二叉树所有一般查找操作vector和string时间复杂度为O(n)时,set和map时间复杂度可能为O(logn),而借助迭代器的插入删除操作的时间复杂度则为O(1)。set和map值唯一且自动升序排列

8.map的主要用途:1.需要建立映射时 2.快速判断元素是否存在

  • 18
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值