STL总结笔记(实用 / 比赛)
文章目录
- 1 STL总览
- 2 string
- 2.1 方法
- 2.2 代码示例
- 2.3 注意事项
- 3 vector
- 3.1 方法
- 3.2 代码示例
- 3.3 注意事项
- 4 set
- 4.1 方法
- 4.2 代码示例
- 5 map
- 5.1 pair
- 5.1.1 方法
- 5.1.2 代码示例
- 5.1.3 注意事项
- 5.2 map
- 5.2.1 方法
- 5.2.2 代码示例
- 5.2.3 注意事项
- 6 stack
- 6.1 方法
- 6.2 代码示例
- 7 queue
- 7.1 普通queue
- 7.1.1 方法
- 7.1.2 代码示例
- 7.2 priority_queue
- 7.2.1 方法
- 7.2.2 代码示例
- 7.2.3 注意事项
- 8 补充
- 8.1 排序
- 8.1.1 less / greater
- 8.1.2 自定义cmp总结(sort/ set/ prioroty_queue)
- 8.2 各个容器 插入/删除 总结
1 STL总览
类型 | 容器名称 | 扩展 |
---|---|---|
字符串 | string | |
动态数组 | vector | |
集合 | set (有序、去重) |
multiset (有序、可重复) unorderd_set(无序、去重) |
关联容器 (键 - 值) |
map (一对一、键有序) |
multimap (一对多) unordered_map (一对一、键无序) |
栈 | stack | |
队列 | queue |
priority_queue (堆 / 优先队列:只能访问队首,即堆顶) dequeue (双端队列:首尾都可插删) |
2 string
2.1 方法
#include<string>
功能 |
方法 string str; |
说明 | 举例 |
---|---|---|---|
长度 | |||
str.length() | |||
str.size() | |||
插入 | |||
str.insert(pos, str2) | 在str[pos]处开始插str2 | ||
s tr.insert(it1, it2, it3) |
it_:string::iterator 迭代器 在str的it1处插str2[it2,it3) |
||
删除 | |||
str.erase(pos, len) | 在str[pos]处开始 往后删,长度为len | ||
str.erase(it) | 删除it所指字符 | ||
str.erase(it1, it2) | 删除str[it1,it2) | ||
清空 | |||
str.clear() | |||
取子串 | |||
str.substr(pos, len) | 得到子串:str[pos]处开始,长度为len | ||
str.substr(pos) | 得到子串:str[pos]处开始,到str尾 | ||
查找 | |||
str.find(str2) | 从str[0]开始查找… | ||
str.find(str2, pos) |
从str[pos]开始查找 成功:返回str2[0]在str的位置(下标) 失败:返回string::npos |
if(str.find("a")!=string::npos){ //查找成功 }
|
|
替换 | |||
str.replace(pos, len, str2) | 从str[pos]开始往后,长度为len的子串被替换为str2 | ||
str.replace(it1, it2, str2) | str[it1, it2)的子串被替换为str2 |
str.replace(str.begin()+2, str.begin()+5,str2);
|
|
字符数组和string的转换 | |||
str.c_str() | string转换为 常数 字符数组(不可变) |
printf("%s\n",str1.c_str()); //string用printf输出 |
|
str = 字符数组 | 字符数组转换为string |
char chs[5] = "abcd"; str = chs;
|
|
string转换为int / double | |||
int = stoi(string) double = stod(string) |
|||
int / double转为string | #include<sstream> |
int a; stringstream ss; ss<<a; string s = ss.str();
|
2.2 代码示例
#include<cstdio>
#include<string>using namespace std;int main(){/*初始化*/string str;/*遍历*/// 下标法for(int i=0; i<str.length(); i++){printf("%c",str[i]);}// 迭代器第 1 种for(string::iterator it=str.begin(); it!=str.end(); it++){printf("%c",*it);}// 迭代器第 2 种string::iterator it=str.begin();for(int i=0; i<str.length(); i++){printf("%c",*(it+i)); // string/vector :可以it+i}return 0;
}
2.3 注意事项
(1)
存储字符串,C和C++(STL)的区别:
// c
char name[5] = "abcd"; //存储: 4个字符 + ‘\0’// c++
string name = "abcd" //没有'\0',可存中文
(2)关于迭代器
只有string和vector才能用:下标访问
只有string和vector才能用:it+i
如:str.begin()+2
(str[2])、 str.end()-1
(str[str.length()-1],最后一个元素)
3 vector
3.1 方法
#include<vector>
功能 |
方法 vector vect; |
说明 | 举例 |
---|---|---|---|
长度 | |||
vect.size() | |||
插入 | |||
vect.push_back(x) | 最后位置插入元素x | ||
vect.insert(it, x) | 在迭代器 it 所指位置插入x | ||
删除 | |||
vect.pop_back() | 删除最后一个 | ||
vect.erase(it) | 删除vect[it] | ||
vect.erase(it1, it2) | 删除vect[it1, it2) | ||
清空 | |||
vect.clear() | |||
复制(深拷贝) | |||
初始化时 |
vector<int> A; vector<int> B(A)
|
||
vect.assign() |
B.assign(A.begin(), A.end());
|
3.2 代码示例
#include<cstdio>
#include<vector>using namespace std;struct Student{int age;char name[10];
};int main(){/*初始化*/// 一维数组vector<int> vect1_1;vector<int> vect1_2(10); //数组大小=10, 默认值vect[i]=0vector<int> vect1_3(10,2); //数组大小=10, 默认值vect[i]=2vector<Student> vect1_4;// 二维数组vector<vector<int> > vect2_1; //行列均不定vector<vector<int> > vect2_2(3, vector<int>(10, 2)); //数组大小=3*10, 默认值vect[i]=2vector<int> vect2_3[10]; //列固定/*遍历:一维,同string*/// 下标法// 迭代器第 1 种// 迭代器第 2 种/*遍历:二维*/// 下标法for(int i=0; i<vect2_2.size(); i++){for(int j=0; j<vect2_2[i].size(); j++){printf("%d", vect2_2[i][j]);}}// 迭代器vector<int> vect_temp;vector<vector<int> >::iterator it = vect2_2.begin();for(; it!=vect2_2.end(); it++){vect_temp = *it;for(vector<int>::iterator it2=vect_temp.begin(); it2!=vect_temp.end(); it2++){printf("%d", *it2);}}return 0;
}
3.3 注意事项
(1)适用:
- 当用普通数组超内存时
- 存储图:邻接表(不用指针)
- 结果要求一行输出,但输出个数不确定:vector存储输出
(2)初始化定义
任何STL, 当内容(<…>)为STL时,> 两侧加空格
如:vector<vector<int> > vect3;
4 set
4.1 方法
#include<set>
功能 |
方法 set s; |
说明 | 举例 |
---|---|---|---|
长度 | |||
s.size() | |||
插入 | |||
s.insert(x) | 插入元素x(自动重新排序和去重) | ||
删除 | |||
s.erase(x) | |||
s.erase(it) | 删除it所指元素 | ||
s.erase(it1, it2) | 删除 [it1到it2) (不能下标访问set) | ||
清空 | |||
s.clear() | |||
查找 | |||
it = s.find(x) |
成功:返回 it 失败:返回s.end() |
4.2 代码示例
#include<cstdio>
#include<cstring>
#include<set>
#include<vector>using namespace std;struct Student{int age;char name[10];Student(int _age, char _name[10]):age(_age){strcpy(name,_name);}
};// 重载排序:按age(升序),之后按name(升序)
bool operator < (const Student &s1, const Student &s2){if(s1.age == s2.age){return strcmp(s1.name, s2.name);}else{return s1.age < s2.age;}
}int main(){/*初始化*/set<int> s1;set<Student> s2;set<int> s3[10]; // set中有10个元素set<vector<int> > s4; // set的每个元素是一个vector s4.insert({1,2,2});/*遍历*/set<int>::iterator it=s1.begin();for(; it!=s1.end(); it++){printf("%d ", *it);}/*结构体*/s2.insert(Student(10,"Bob"));s2.insert(Student(10,"Bob"));s2.insert(Student(8,"Dave"));s2.insert(Student(10,"Alice"));set<Student>::iterator it2=s2.begin();for(; it2!=s2.end(); it2++){printf("%d %s\n",it2->age,it2->name);}return 0;
}
5 map
5.1 pair
5.1.1 方法
#include<map>
无
5.1.2 代码示例
#include<cstdio>
#include<map>
#include<string>using namespace std;int main(){/*初始化*/pair<string, int> pa1("Bob",20); //内容可为STLpair<string, int> pa2;/*插入*/// 1. 直接pa2.first = "Mary";pa2.second = 30;// 2. 临时构建pa2 = pair<string, int>("Amy",22); //方法一pa2 = make_pair("Amy",22); //方法二/*访问*/printf("%s %d\n",pa2.first.c_str(),pa2.second);/*比较:依次比较first, second*/if(pa1 < pa2){printf("<\n");}return 0;
}
5.1.3 注意事项
(1)相当于二元结构体
(2)配合map使用
5.2 map
5.2.1 方法
#include<map>
功能 |
方法 map mp; |
说明 | 举例 |
---|---|---|---|
长度 | |||
mp.size() | |||
插入 | |||
mp.insert(pair) | |||
删除 | |||
mp.earse(key) | 删除key对应的键-值对 | ||
mp.earse(it) | 删除it所指键-值对 | ||
mp.earse(it1, it2) | 删除 [it1到it2) (不能下标访问map) | ||
清空 | |||
mp.clear() | |||
查找 | |||
it = mp.find(key) |
key为键名 成功:返回 it 失败:返回mp.end() |
5.2.2 代码示例
#include<cstdio>
#include<map>
#include<string>using namespace std;int main(){/*初始化*/map<string, int> mp1; // 字符串只能用string,不能用char字符数组map<set<int>, string> mp2; //可为STL/*插入:键唯一*/// 1. 直接mp1["Bob"] = 10;mp1["Amy"] = 20;mp1["Mary"] = 30;// 2. 用pairmp1.insert(make_pair("Bob",10));mp1.insert(pair<string, int>("Amy",20));/*删除*/// 1.键mp1.erase("Bob");// 2.迭代器 (it)map<string, int>::iterator it = mp1.begin();mp1.erase(it);// 2. 迭代器 [it1,it2)it = mp1.begin();mp1.erase(it, mp1.end());/*访问*/// 1. 键printf("%d\n",mp1["Bob"]);// 2. 迭代器map<string, int>::iterator it;for(it=mp1.begin(); it!=mp1.end(); it++){printf("%s %d\n",(it->first).c_str(),it->second);}/*查找*/if(mp1.find('Bob')!=mp1.end()){// 查找成功printf("%s %d\n",(it->first).c_str(),it->second);}/*排序*/// 按key排序map<string, int> mp3; //默认lessmap<string, int, greater<string> > mp4; //greatermap<string, int, cmp> mp5; //自定义cmp// 按value排序return 0;
}
5.2.3 注意事项
(1)相当于字典:任何数据类型<—映射—>任何数据类型
String <—映射—> int String <—映射—> int
(2)判断 大整数、其他类型数据是否存在(map相当于bool[])
(3)键有序,键唯一
6 stack
6.1 方法
#include<stack>
功能 |
方法 stack st; |
说明 | 举例 |
---|---|---|---|
长度 | |||
st.size() | |||
插入 | |||
st.push(x) | 栈顶插入 | ||
删除 | |||
st.pop() | 栈顶 删除 | ||
取栈顶 | |||
st.top() | 返回栈顶元素 | ||
判断空 | |||
st.empty() |
6.2 代码示例
#include<cstdio>
#include<stack>using namespace std;int main(){/*初始化*/stack<int> st1;/*插入:栈顶*/for(int i=0;i<3;i++){st1.push(i);}/*删除:栈顶*/st1.pop();/*访问:栈顶*/printf("%d\n", st1.top());/*判断空*/if(!st1.empty()){printf("size %d\n", st1.size());}return 0;
}
7 queue
7.1 普通queue
7.1.1 方法
#include<queue>
功能 |
方法 queue q; |
说明 | 举例 |
---|---|---|---|
长度 | |||
q.size() | |||
插入 | |||
q.push(x) | 队尾插入 | ||
删除 | |||
q.pop() | 队首 删除 | ||
取队首 | |||
q.font() | 返回队首元素 | ||
取队尾 | |||
q.back() | 返回队尾元素 | ||
判断空 | |||
q.empty() |
7.1.2 代码示例
#include<cstdio>
#include<queue>using namespace std;int main(){/*初始化*/queue<int> q1;/*插入*/for(int i=0;i<3;i++){q1.push(i);}/*删除*/q1.pop();/*访问*/printf("%d %d\n",q1.front(), q1.back());/*判断空*/if(!q1.empty()){printf("size %d\n", q1.size());}return 0;
}
7.2 priority_queue
7.2.1 方法
#include<queue>
功能 |
方法 priority_queue pq; |
说明 | 举例 |
---|---|---|---|
长度 | |||
pq.size() | |||
插入 | |||
pq.push(x) | 堆顶(队首)插入 | ||
删除 | |||
pq.pop() | 堆顶 删除 | ||
取堆顶 | |||
pq.top() | 返回堆顶元素 | ||
判断空 | |||
pq.empty() |
7.2.2 代码示例
#include<cstdio>
#include<queue>using namespace std;struct Student{int age;char name[10];Student(int _age, char _name[10]):age(_age){strcpy(name,_name);}/*内部重载operator*/friend bool operator < (const Student &stu1, const Student &stu2){ // 比较大小:只能用string, 不能char[]return stu1.age < stu2.age;}};struct cmp{bool operator () (const Student &stu1, const Student &stu2){return stu1.age < stu2.age; }
};int main(){/*初始化*/priority_queue<int> pq1; // 默认:大根堆(大的在队首)priority_queue<char> pq2; // pq2 等同 pq3priority_queue<char, vector<char>, less<char> > pq3; // 大根堆priority_queue<double, vector<double>, greater<double> > pq4; // 小根堆// 结构体(pq5和pq6等价,都是大根堆)priority_queue<Student> pq5; // 内部重载operator,必须重载priority_queue<Student, vector<Student>,cmp> pq6; // 外部重载operator/*插入:堆顶*/for(int i=0;i<3;i++){pq1.push(i);}pq5.push(Student(20,"Amy"));/*删除:堆顶*/pq1.pop();/*访问:堆顶*/printf("%d\n", pq1.top());/*判断空*/if(!pq1.empty()){printf("size %d\n", pq1.size());}return 0;
}
7.2.3 注意事项
(1)优先队列:本质是 堆
8 补充
8.1 排序
8.1.1 less / greater
数组 + sort()
vector + sort()
set
priority_queue
map:(1)按key。(2)按value + sort()
因此,只需了解 4种:sort()、set、priority_queue、map(按key)
- 这4种都是默认less,含不一样
sort()、set、map(按key):默认less(从小到大)
priority_queue:默认less(大根堆)
// 数组 + sort()
#include<algorithm>
#include<functional> //greater()int arr[10];
sort(arr, arr+10);
sort(arr, arr+10, greater<int>());
sort(arr, arr+10, cmp);// vector + sort()
#include<algorithm>
#include<functional>
#include<vector>vector<int> vect;
sort(vect.begin(), vect.end());
sort(vect.begin(), vect.end(), greater<int>());
sort(vect.begin(), vect.end(), cmp);//set
#include<set>set<int> st;
set<int, greater<int> > st;
set<int, CMP> st;//map
#include<map>// 按key
map<string, int> mp;
map<string, int, greater<string> > mp;
map<string, int, CMP> mp;
// 按value
map<string, int> mp;
vector<pair<string, int> > vect(mp.begin(), mp.end()); //转为vector + sort
sort(vect.begin(), vect.end(), CMP()); // CMP为类,不是bool函数,要加()// priority_queue
8.1.2 自定义cmp总结(sort/ set/ prioroty_queue)
结构体 外部 重载cmp
只需要记住sort()的cmp符号顺序:
与sort()符号顺序相比:
set、map(按key)相同
priority_queue相反符号顺序:
sort()的cmp(a,b):升序:假设a在b前面,只有当a<b时
因此:bool cmp(int a, int b){ return a < b; }
struct Student{int age;string name;Student(int _age, string _name):age(_age){name = _name;}
};/*
一次排序:age升序
*/
// sort函数
bool cmp(Student stu1, Student stu2){return stu1.age < stu2.age; //stu1在stu2前面,只有当stu1<stu2时
}
// set、map(按key)
struct CMP{bool operator () (const Student &stu1, const Student &stu2){return stu1.age < stu2.age; }
};
// map(按value):转换为vector后用sort()
struct CMP{bool operator()(const pair<string, int> &pair1, const pair<string, int> &pair2){return pair1.second < pair2.second;}
};
// priority_queue
struct CMP{bool operator () (const Student &stu1, const Student &stu2){return stu1.age > stu2.age; }
};/*
二次排序:age升序,name降序
*/
// sort函数
bool cmp(Student stu1, Student stu2){if(stu1.age == stu2.age){return stu1.name > stu2.name; }else{return stu1.age < stu2.age; // age升序}
}
// set、map(按key)
struct cmp{bool operator () (const Student &stu1, const Student &stu2){if(stu1.age == stu2.age){return stu1.name > stu2.name; }else{return stu1.age < stu2.age; // age升序} }
};
// priority_queue
struct cmp{bool operator () (const Student &stu1, const Student &stu2){if(stu1.age == stu2.age){return stu1.name < stu2.name; }else{return stu1.age > stu2.age; // age升序} }
};
8.2 各个容器 插入/删除 总结
vector | set(有序,唯一) | map | stack | queue | |
---|---|---|---|---|---|
插入 | insert(it, x) | insert(x) | insert(Pair) | ||
push_back(x) | push(x) | push(x) | |||
vector[i] = … | map[key] = … | ||||
删除 | erase(it) | erase(it) | erase(it) | ||
erase(it1, it2) | erase(it1, it2) | erase(it1, it2) | |||
erase(x) | erase(key) | ||||
pop_back() | pop() | pop() |
STL总结笔记(实用 / 比赛)相关推荐
- Effective STL 读书笔记
Effective STL 读书笔记 标签(空格分隔): 未分类 慎重选择容器类型 标准STL序列容器: vector.string.deque和list(双向列表). 标准STL管理容器: set. ...
- C++ STL学习笔记
C++ STL学习笔记一 为何要学习STL: 数据结构与算法是编程的核心,STL中包含各种数据结构和优秀的算法,确实值得深入学习,本文中虽然着重使用,但希望有心的朋友能多看看相关数据结构的实现,对于C ...
- C++STL学习笔记(4) 分配器(Allocator)
在前面的博客<C++ STL学习笔记(3) 分配器Allocator,OOP, GP简单介绍>中,简单的介绍了分配器再STL的容器中所担当的角色,这一节对STL六大部件之一的分配器进行详细 ...
- C++ STL学习笔记(3) 分配器Allocator,OOP, GP简单介绍
继续学习侯捷老师的课程! 在前面的博客<C++ STL学习笔记(2) 容器结构与分类>中介绍了STL中常用到的容器以及他们的使用方法,在我们使用容器的时候,背后需要一个东西支持对内存的使用 ...
- 笔记-Codeforces比赛
笔记-Codeforces比赛 文章讲的是 Codeforces\texttt{Codeforces}Codeforces 的使用,所以需要先注册登入. 简介 Codeforces\texttt{Co ...
- 【Python基础】Pandas笔记---通过比赛整理出的10条Pandas实用技巧
点击上方"潜心的Python小屋"关注我们,第一时间推送优质文章. 前言 大家好,我是潜心.最近还在参加某比赛,将pandas对数据预处理的方法进行了总结,以下列出的10条是我觉得 ...
- C++ STL学习笔记 : 1. template 模板函数
本篇文章是学习C++ STL库的第一篇笔记,主要记录了使用template关键字创建模板函数的方法. 下面用一个非常简单的例子解释模板函数的用法 : #include <iostream> ...
- 【C++ STL学习笔记】C++ STL序列式容器(array,vector,deque,list)
文章目录 C++ STL容器是什么? 迭代器是什么,C++ STL迭代器(iterator)用法详解 迭代器类别 迭代器的定义方式 C++序列式容器(STL序列式容器)是什么 容器中常见的函数成员 C ...
- STL学习笔记(一)
2019独角兽企业重金招聘Python工程师标准>>> 1. 容器(Containers) 容器分为两类: 序列式容器(Sequence containers),此乃可序群集,其中每 ...
- SGI STL 学习笔记二 vector
sequence containers Array Vector Heap Priority_queue List sList(not in standard) Deque Stack Queue S ...
最新文章
- 找java培训机构如何挑选
- AI解译遥感影像,商汤的“黑科技”了解一下
- 为什么你写的代码糟透了?
- CLR 4.0 有哪些新东西? -- 类型等价
- 【MYSQL命令】查看一个表的建表语句
- sap gateway development mode
- 计算机维修与维护入门,计算机组装与维护基础知识
- http请求POST方式发送获得返回值
- C++ 普通函数和模板函数调用规则
- 经典水晶报表设计三则
- 如何安装SQL server 2000 SP4补丁
- 中兴e9000服务器,ZXCTN 9000-E设备系列_ZXCTN 9000-E系列中兴传输设备_中兴设备 - 诺深达华为光端机...
- linux下载navicat
- 联通手机卡网速的修改
- 中国脑计划颠覆性创新之路四,用脑科学预测互联网的未来发展趋势
- html 5标签读音,radish读音
- 重要:QA和QC的区别
- yii2 aliases web.php,别名(Aliases) - Yii2 权威指南
- WICC | 风口之下,音视频社交出海的三大新机遇
- python unicode码转换_python实现unicode转中文及转换默认编码的方法
热门文章
- 网易新闻iOS版开发使用的第三方框架和组件列表
- 开源版多用户博客系统
- MySQL中多表的连接
- localdatetime 格式化_LocalDateTime取代Data处理时间问题
- 从其他项目中复制过来的mapper加载不进bean_手把手带你玩转k8s-一键部署springboot项目...
- curl basic 认证
- Mybaitis框架与Spring整合详解(三)
- Java基础,不需要复杂语句,使用for循环实现求出1~100之间的奇数和以及偶数和,超级简单
- php 上标,PHP数组上标类型陷阱
- JS中使用MD5进行字符串加密