C++中已经实现了数据结构中的很多容器和算法,它们构成了C++库的子集,即标准模板类库。STL是一个功能强大的基于模板的容器库。
遵循“尽可能使用STL而不是自己实现”,下面整理STL的一些使用方法便于搜索。(之前已经整理了一些例如map)
持续更新中ing,未完待续(只能抽时间来写)
你的三连就是我创作的最大动力。
目录
STL概述
STL只要由容器,算法和迭代器。迭代器用于存放元素。下面给出常用的数据结构。算法主要由
数据结构 | 说明 |
---|---|
向量vector | 连续存储元素,底层数据结构为数组,支持快速随机访问 |
字符串string | 字符串处理容器 |
双端队列deque | 连续存储的指向不同元素的指针所组成的数组 |
链表list | 由节点组成的链表,每个结点包含一个元素,底层为双向链表 |
队列queue | 先进先出的序列 |
栈stack | 后进先出的序列 |
集合set | 由节点组成的黑红树,set有序不重复 |
映射map | 由关键词,值组成的集合,底层为红黑树 |
C++引入了命名空间,STL的sort()封装在std中了。
STL迭代器
STL迭代器用于访问容器中的数据对象,它就像C++中的指针,算法通过迭代器来定位和操作容器的元素。
常用迭代器 | 说明 |
---|---|
iterator | 指向容器存放的元素,用于正向遍历 |
const_iterator | 只能读取元素 |
reverse_iterator | 指向容器中元素的反向迭代器,用于反向遍历 |
++正向移动;–反向移动;*返回迭代器所指的元素值
vector<int> m={1,2,3,4,5};
vector<int>::iterator it;
for(it=m.begin();it!=m.end();++it)cout<<*it<<" ";
顺序容器
部分成员函数相同的只写一遍,大多容器的成员函数功能都相同
vector
相当于数组。
定义vector的几种方法
vector<int> v1
vector<int> v2(10);//指定向量v2大小为10个
vector<int> v3(10,1.23) //指定v3的10个初始值为1.23
vector<int> v4(a,a+5) //用数组5个元素初始化
vector主要成员函数 | 功能 |
---|---|
empty() | 空 |
size() | 返回实际元素个数 |
[] | 返回指定下标元素 |
reserve(n) | 分配n个空间 |
capacity | 返回重新分配前所容纳的个数 |
push_back | 向尾部添加 |
insert(pos,elem) | 在pos位置插入elem |
rbegin()/rend() | 引用最后一个/第一个 |
string
string重载了许多运算符,包括+,+=,<,=,[],<<,>>等
创建string容器的方法
char a[]="CHINA";
string s1(a)
string s2(s1)
string s3(a,5)
string s4(5,'A')
string成员函数 | 功能 |
---|---|
compare(string &str) | 比较字符串 |
append(cstr) | 末尾添一个字符串 |
substr(size_type,size_len) | 取子串 |
clear() | 删除所有 |
erase(idx,len) | 删除从idx开始的len个字符 |
关联容器
关联容器都有一个key,通过key来存储和读取元素,这些关键字与位置无关,故没有顺序容器等部分操作。
set/multiset
集合类模板,set关键字唯一,而multiset不唯一。
set/multiset成员函数 | 功能 |
---|---|
empty() | 判断空 |
count(k) | 关键词出现的次数 |
find(k) | 存在k |
end/begin | 正向迭代 |
rbegin/rend | 反向迭代 |
set<int> s;
set<int>::iterator it;
s.insert(key);
map/multimap
映射类模板,实现关键字与值关系的存储结构
类似于pair结构
struct pair{
T first;
T second;
}
pair对运算符进行了重载
map支持[]运算符,multimap则不支持
成员函数功能同set,这里不再赘述。其中部分语法可以见此处blog,有详细解释其中的语法,其中有专项练习。点击此处
//只有当map有关键字才会成功,否则自动插入
if(m.find(key)==m.end()){//没找到的处理}
else {//找到后的处理}
map<char,int> m;
m.insert(pair<char,int>('a',1);
m.insert(map<char,int>::value_type('b',2);
//遍历操作
map<char,int>::iterator it;
for(it=m.begin();it!=m.end();++it){
cout<<it->first<<" "<<it->second;
}
适配器容器
stack
成员函数 | 功能 |
---|---|
empty() | 空 |
push(elem) | 进栈 |
top() | 返回栈顶元素 |
pop() | 出栈 |
queue
成员函数 | 功能 |
---|---|
front() | 返回队头元素 |
back() | 返回队尾 |
push(elem) | 进队 |
pop() | 进队,配合while(!empty())操作 |
对数据的排序
内置数据类型的排序
sort()默认以less(小于关系函数)作为增序排序,为实现递减排序,需要调用functional头文件定义的greater类模板
vector<int> m;
sort(m.begin(),m.end(),less<int>())//等同于sort
sort(m.begin(),m.end(),greater<int>())//递减排序
自定义数据类型排序
sort(m.begin(),m.end(),Cmp);
//实现结构体排序
struct Stud{
int no;
string name;
}
bool cmp(Stud a,Stud b){
return a.no<b.no;
}