0
点赞
收藏
分享

微信扫一扫

22/1/31 STL

码农K 2022-02-01 阅读 21

一、map(映射)

其实,数组就是一种映射。

int a[100];
//定义了一个int到int的映射
a[5]=25;
//5映射到25

数组总是将int类型映射到其他基本类型(称为数组的基类型),同时带来一个问题:string映射成int,数组就不方便。这时就可以用map。
map可以将任何基本类型(包括STL容器)映射到任何基本类型(包括STL容器)。

(一)、map的用途

至少有以下三种情形
1、需要建立字符(串)与整数之间的映射,用map可以减少代码量
2、判断大整数(比如几千位)或者其他类型数据是否存在,可以把map当做布尔型数组使用(哈希表)
3、字符串与字符串之间的映射

#include<map>   //头文件
using namespace std;
map<tpyename1,typename2>name;  //定义一个map
/*typename1 映射前的类型(键key) 
tapename2 映射后的类型(值value) 
name  映射的名字
*/

普通int数组a就是map<int,int> a。
而如果是字符串到整型的映射,就必须使用string,而不能使用char,即map<string,int> a。
map的键和值也可以是STL容器,比如:map<set,string> mp。
当然,map的键和值都是唯一的

(二)、map 的访问

访问 map 的元素有两种方式,一种是通过下标访问;另一种是通过迭代器访问。
通过下标访问就像普通的数组元素访问,例如先定义map<char,int> mp,然后就可以通过mp[‘c’]的方式来访问它对应的元素,如mp[‘c’]=124。
通过迭代器访问,先作如下定义:
map<typename1,typename2>::iterator it;
因为map的每一对映射都有两个typename,所以,我们使用“it->first”来访问键,而使用“it->second”来访问值。

(三)、map 的常用函数

1、find()和 size()
find(key)是返回键为 key 的映射的迭代器,时间复杂度为 0(log2 n),n 为 map 中映射的对数。
size()用来获得map中映射的对数,时间复杂度为O(1)。
2、clear()
用来清空 map,时间复杂度为 0(n)。
3、erase()
erase()可以删除单个元素,也可以删除一个区间内的所有元素。
1)删除单个元素
①erase(it),it为要删除的元素的迭代器,时间复杂度为O(1)。
②erase(key),key为要删除的映射的键,时间复杂度为O(log2 n)。
2)删除一个区间内的所有元素
erase(first,last),first为区间的起始迭代器,last为区间的末尾迭代器的下一个地址,也就是左闭右开的区间[first,last),时间复杂度为O(last-first)。

二、pair

pair 是“二元结构体”的替代品,将两个元素捆绑在一起,节省编码时间。

#include<utility>	//头文件
using namespace std;
/*因为map的内部实现中涉及pair,
因此添加map头文件时会自动添加utility头文件,
此时可以省去utility头文件。
*/
pair<typename1,typename2>name;//定义
//两个typename均可以是任意基本数据类型或者容器

相当于以下定义

struct pair{
	typename1 first;
	typename2 second;
}

三、set(集合)

set是一个内部自动有序且不含重复元素的容器。
set 最主要的作用就是自动去重并按升序排序,因此遇到需要去重但是又不方便直接开数组的情况时可以使用。
set 中的元素是唯一的,其内部采用“红黑树”实现。

 #include <set>
using namespace std;
set<typename> name;
//typename 可以是任何基本类型或者容器,name 是集合的名字

四、vector(向量/ 变长数组)

“长度根据需要而自动改变的数组”
需要定义很大数组时可能出现“超出内存限制”的错误,如图的顶点太多,使用邻接矩阵时会超出内存限制、使用指针实现邻接表有很容易出错,使用vector实现简洁方便且节省存储空间。

#include<vector>
using namespace std;
vector<typename>name;
/*typename可以为任何基本类型,例如int、double、char、结构体等,
也可以是STL标准容器,如vector、queue等。
*/

以上定义相当于定义了一个一维数组name[size],但size不确定,长度可以根据需要而变化。

(一)、访问 vector 中的元素一般有两种方式

1、通过“下标”访问。
例如,对于容器 vector v,可以使用 v[index]来访问它的第 index 个元素。其中,0≤index≤v.size()-1,v.size()表示 vector 中元素的个数。
2、通过“迭代器”访问。
可以将迭代器(iterator)理解为一种类似指针的变量。其定义为:

vector<typename>::iterator it;

例如:

vector<int>::iterator it= v.begin();
for(int i = 0; i <= 5; i++) 
	printf("%d ",*(it + i));

(二)、vector常用函数

1、push_back()
push_back(x)用来在 vector 后面添加一个元素 x,时间复杂度为 0(1)。
2、size()
如果是一维数组,size()用来获得 vector 中元素的个数;
如果是二维数组,size()用来获得vector 中第二维的元素个数,时间复杂度为 0 (1)。
3、pop_back()
pop_back()用来删除 vector 的尾元素,时间复杂度为 0(1)。
4、clear()
clear()用来清空 vector 中的所有元素,时间复杂度为 0(n),其中 n 为 vector 中元素的个数。
5、insert ()
insert(it,x)用来向 vector 任意迭代器 it 处插入一个元素 x,时间复杂度为 0(n)。
6、erase()
erase()用来删除 vector 中的元素,有两种用法。
一种是 erase(it),删除迭代器 it 处的元素;
另一种是 erase(first,last),删除左闭右开区间[first,last)内的所有元素。

五、string

在C语言中,一般使用字符数组char str[]来存放字符串,但是操作麻烦,容易出错。C++在STL中加入了string类型,对字符串常用的需求功能进行了封装,使得操作起来更加方便,且不必担心内存是否足够、字符串的长度等问题。

#include<string>
using namespace std;
string name;
string str="hello";
/*初始化或者不初始化*/

一种访问 string 的方法,就像普通字符数组一样操作。例如:

string str= “ abcd “ ;
for(int i = 0; i < str.length(); i++) printf(%c “ ,str[i]);
// 输出 abcd

如果要读入或者输出整个字符串,一般只用cin和cout。如果非要用printf,则需要用c_str()将string转换成字符数组。

     string str;
   cin>>str;
   cout<<str<<endl;
   printf("%s\n",str.c_str());
举报

相关推荐

0 条评论