1、sting
C++ 标准库提供了 string 类类型,支持C语言风格的字符串数组所有的操作,另外还增加了其他更多的功能。
string类型的具体的函数与其他数据结构的函数有许多重复,在此不做系统总结,只区分一下c++三个关于string的头文件:
1)文件cstring,和string.h对应,c++版本的头文件,包含比如strcpy之类的字符串处理函数
2)文件string.h,和cstring对应,c版本的头文件,包含比如strcpy之类的字符串处理函数
3)文件string,包含std::string的定义,属于STL范畴
即:若需要使用string类型,需要包含头文件,如果只需要相关的字符串处理函数(用于字符数组或字符串)需要包含头文件(c++写法)或<string.h>(c写法)
2、变长数组vector
STL提供的可以更改大小容量的数组类型,相较于普通数组不仅拥有变长的好处,在数据操作上也方便了许多,下面是部分功能函数举例:
#include<vector>v:变长数组
v.push_back(value)//在vector的最后添加元素
v.pop_back()//删除最后一个元素
v.size()//返回v的长度
v.resize(int value)//重新定义v的长度
v.empty()//测试长度是否为空
v.clear()//清空v
v.insert(it/*迭代器*/,value)//在对应位置插入元素,迭代器仍指向原本位置的元素
vector<int>a[20]//初始化 注意这种定义是定义了一个vector<int>的数组,数组中每个元素是一个vector,可以以此来模拟链表。
构造迭代器时也需要加上下标:
vector<T>::iterator it=a[i].begin()//构造迭代器,指向第一个元素
a[i].erase(it)//删除某个元素 要用到迭代器 删除后后面的元素会覆盖该位置
a[i].clear()//清空a[i]下所有元素
对vector的遍历可以使用下标也可使用迭代器
对vector的排序,vector类没有自带的sort函数,所以可以使用sort函数
sort(v.begin(), v.end())
3、栈和队列
在理解了栈和队列的工作原理在机试时就不用反复造轮子了,STL提供了很好的栈和队列模拟数据结构,下面介绍其实现和常用的功能。
#include<stack>//stack:栈
stack<type> s//创建元素类型为type的栈s
s.pop() //栈顶元素出栈,注意这里并不会返回栈顶元素值
s.push(value)//将value压入栈,成为栈顶元素
s.empty()//判断栈是否为空,返回bool值
value=s.top()//返回栈顶元素
s.size()//获取栈长度
/********************
********************/
#include<queue>//queue:队列
queue<type>q//创建元素类型为type的队列q
q.pop() //队头元素出队列,这里同样不会获得该值
q.push(value)//将value推入队列,成为队尾元素
q.empty()//判断队列是否为空
value=q.front()//获取队头
q.size()//获取队列长度
4、set集合
set数据类型的特点:
1、set没有重复元素
2、set有默认排序
3、set的添加元素使用insert()
#include<set>//set集合:有序(数字从小大到大 字典序)且无重复元素
set.insert(value)添加元素
set.size()//集合元素个数
//使用迭代器遍历
set<int>iterator::it it=set.find(value)//返回迭代器 找到某个元素的迭代器
set.count(value)//返回set中value的个数(1/0),可用于机试题中重复值的判断
set.upper_bound(x)//对于有序序列set,返回大于x的第一个元素位置
set.lower_bound(x)//返回大于等于第一个元素的位置
set.erase()//可以删除合法迭代器所指的元素也可以直接输入元素值进行删除
一道例题: 使用set解决《newspaper headline》问题
5、map集合
map数据类型常用于实现机试题中重复值的判断,复杂值的简化编号等功能,是非常便捷好用的一种数据类型。
#include<map>//map映射
map<string,int>mp//定义键值为stringm,元素值为int的map类型
mp.count(a);//判断该键值下有无元素,若没有返回0,若有返回1
mp[a]=b;//为a键值赋值映射值b
mp.erase()//可以删除对应键值的元素也可以删除迭代器所指元素
- 栈和队列不支持遍历,除vector外,其他数据结构(set、map)的遍历需要使用迭代器。
- set map string中可用直接使用成员函数.find() ,vector中需要使用find()函数 。
vector<int>::iterator it = find(vec.begin(), vec.end(), 6);
- set map vector中find函数返回的是指向该元素的迭代器,没有找到返回.end()可以与set.end()等作比较判断是否存在某元素,stirng中返回的是对应字符或字符串首次出现的位置。
- 对于有序序列a或vector v,可以使用
upper_bound(a,a+n,x)//返回大于x的第一个元素迭代器
lower_bound(a,a+n,x)//返回大于等于第一个元素的迭代器