前言
STL之前只会用 stack 和 queue ,set 和 map 啥的也不太会用。学习一下。
队列(queue)
概述
队列是一种特殊的线性表,是一种先进先出(FIFO)的数据结构。它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列中没有元素时,称为空队列。
用法
首先使用之前需要声明头文件 #include<queue>
,通过 queue<typename> q
的形式来进行定义队列,上述为定义了一个队列元素类型为 typename 的队列,队列名称为 q,typename可以为C++原有数据类型,例如int,char,string这些,也可以是自定义的结构体类型等。
主要函数及用途
使用下述函数都是用类似于 队列名称.函数名() 的形式,好比pop函数就是 q.pop()
- push(x) 将元素x从队尾入队
- front( ) & back( ) 分别为获取队首元素和队尾元素,使用的时候必须确保队列不为空
- pop( ) 弹出队首元素,使用的时候必须确保队列不为空
- empty( ) 判断队列是否为空,空返回true,不空返回false
- size( ) 查询队列中有多少个元素
应用实例
#include<cstdio>
#include<iostream>
#include<queue>
using namespace std;
queue<int> q;
int main()
{
q.push(1);
if(!q.empty()) printf("%d\n",q.front()); //
q.push(2);
if(!q.empty()) printf("%d\n",q.back());
printf("%d\n",q.size());
if(!q.empty()) q.pop();
if(q.empty()) printf("queue is empty\n");
else printf("queue is not empty\n");
if(!q.empty()) q.pop();
if(q.empty()) printf("queue is empty\n");
}
/*
运行结果
1
2
2
queue is not empty
queue is empty
*/
栈(stack)
概述
与队列相对应,是一种先进后出(FILO)的数据结构,限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。
用法
首先使用之前需要声明头文件 #include<stack>
,通过 stack<typename> s
的形式来进行定义栈,上述为定义了一个队列元素类型为 typename 的栈,栈名称为 s,typename可以为C++原有数据类型,例如int,char,string这些,也可以是自定义的结构体类型等。
主要函数及用途
使用下述函数都是用类似于 栈名称.函数名() 的形式,好比pop函数就是 s.pop()
- push(x) 将元素x压栈
- pop( ) 将栈顶元素出栈,使用时确保栈不为空
- top( ) 获取栈顶元素的值,使用时要确保栈不为空
- size( ) 返回栈中元素的个数
- empty( ) 查询栈是否为空,空返回true,不空返回false
应用实例
#include<cstdio>
#include<iostream>
#include<stack>
using namespace std;
stack<int> s;
int main()
{
s.push(1);
s.push(2);
printf("Now the top element is %d\n",s.top()); //Now the top element is 2
printf("Now the stack size is %d\n",s.size()); //Now the stack size is 2
if(!s.empty()) s.pop(); //元素2 弹出栈
printf("Now the top element is %d\n",s.top()); //Now the top element is 1
printf("Now the stack size is %d\n",s.size()); //Now the stack size is 1
if(s.empty()) printf("stack is empty\n");
else printf("stack is not empty\n"); //stack is not empty
if(!s.empty()) s.pop(); //元素1 弹出栈
if(s.empty()) printf("stack is empty\n"); //stack is empty
else printf("stack is not empty\n");
}
/*
运行结果
Now the top element is 2
Now the stack size is 2
Now the top element is 1
Now the stack size is 1
stack is not empty
stack is empty
*/
映射(map)
概述
map是STL的一个关联容器,提供一对一的数据处理能力,可以建立两个数据之间一一映射关系,map的定义需要关键字和存储值两个参数,我们可以通过关键字来查找对应的存储值(感觉类似于下标可以为任何类型的数组)吧,因为map的底层实现为红黑树(虽然我没学过),所以具有自动排序功能,也就是说map内部有序。
用法
使用之前声明头文件 #include<map>
,通过 map<typename,typename> m
的形式来定义映射,如果我们要建立string和int这两个类型之间的一一映射,就可以写成 map<string,int> m
,我们可以通过关键字string来查找对应的int值。下述的讲述我们用这个m这个映射来进行。
迭代器
迭代器就是类似于指针吧,我们可以通过map<string,int>::iterator it
,来定义一个对应映射的迭代器,他能够用来指向map中的元素,通过它们我们可以对map执行定点删除,遍历等操作。
主要函数及用途
1. 插入数据
- 通过insert函数进行插入
m.insert(pair<string,int>("zs",1))
m.insert(make_pair("zs",2))
- 通过类似于数组的形式插入
m["zs"] = 2
上述两种形式有一定的区别,因为集合中元素是唯一的,用insert函数插入的时候,如果已经有相应的关键字,那么就不会插入。而如果用类似于数组的方式进行插入,就会覆盖原关键字对应的值。
map<string,int> m;
int main()
{
m.insert(pair<string,int>("zs",1));
printf("%d ",m["zs"]);
m.insert(make_pair("zs",2));
printf("%d ",m["zs"]);
m["zs"]=2;
printf("%d ",m["zs"]);
/*
输出结果 1 1 2
*/
}
2. 查找数据
通过find函数来查找关键字在map中的位置,如果找到了的话就返回对应的迭代器,如果没有找到的话就返回尾部的迭代器(end函数返回的值)。
map<string,int> m;
int main()
{
map<string,int>::iterator it;
m["zs"]=1;
it=m.find("zs");
cout<<it->first<<" "<<it->second;
/*
输出结果 zs 1
*/
}
3. 删除数据
- 清空map,可以使用clear函数。
- 删除特定元素
- 先用find函数找到特定元素的迭代器,通过erase函数清除。
- 直接通过相应关键字清除。
- 删除一串序列,通过erase(起始迭代器,终点迭代器) 来实现。
map<string,int> m;
int main()
{
map<string,int>::iterator it;
m["zs"]=1;
it=m.find("zs");
m.erase(it);
it=m.find("zs");
if(it==m.end())
printf("Not find zs\n");
m["zs"]=2;
m.erase("zs");
it=m.find("zs");
if(it==m.end())
printf("Not find zs");
/*
输出结果 Not find zs
Not find zs
*/
}
4. 其他
- count(“关键字”) 查询相应关键字在map中是否出现过,出现过返回1,没出现返回0
- empty( ) 判断是否为空,空返回true,不空返回false
- begin( ) & end( ) 分别为返回头和尾迭代器,配合迭代器可实行遍历
- iterator->first & iterator->second 分别对应相应迭代器指向的元素的关键字和值
集合(set)
概述
set为一个容器,用来存储同一数据类型的数据,并且能从一个数据集合中取出数据,在set中每个元素的值都唯一(集合的唯一性),并且内部能根据元素的值自动进行排序。
用法
使用之前需要声明头文件 #include<set>
,通过 set<typename> s
来定义一个存储数据类型为typename的集合,名字叫做s。下述实例用此做基础。
迭代器
通过set<typename>::iterator it
,可以来定义一个相应的set的迭代器,用来遍历和指向其中元素。
主要函数及用途
1. 插入数据
- 插入特定元素可以通过
s.insert(3)
插入对应键值,返回值为pair<set::iterator,bool> ,后续bool变量标志是否成功,如果元素3已经存在,那么bool值为false,迭代器对应的是该元素在其中的位置,如果元素不存在其中,返回true,并且返回的迭代器对应的在集合中位置 - 插入一个区间的元素,例如有整数数组a ,可以用
s.insert(a,a+3)
,可以将a中的 a[0] a[1] a[2] 插入到set中。
2. 删除数据
删除和map非常像,也是三种。具体可参考map讲解。
3. 查找元素
也是可以通过find函数,也是和map非常的像~
4. 其他
- begin() & end( ) 返回头尾迭代器,注意尾迭代器是尾元素的后一位。
- clear( ) 清除set容器中所有元素
- empty( ) 判断set容器是否为空,为空则返回true,不空返回false
- size( ) 返回当前set容器中元素的个数
- rebegin( ) & rend( ) 返回尾和头迭代器,配合reverse_iterator可以反序遍历set
关于vector和string等
vector好的学习文章 : C++ vector容器浅析
string好的学习文章 : C++ STL(一)介绍及string