文章目录

  • 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总结笔记(实用 / 比赛)相关推荐

  1. Effective STL 读书笔记

    Effective STL 读书笔记 标签(空格分隔): 未分类 慎重选择容器类型 标准STL序列容器: vector.string.deque和list(双向列表). 标准STL管理容器: set. ...

  2. C++ STL学习笔记

    C++ STL学习笔记一 为何要学习STL: 数据结构与算法是编程的核心,STL中包含各种数据结构和优秀的算法,确实值得深入学习,本文中虽然着重使用,但希望有心的朋友能多看看相关数据结构的实现,对于C ...

  3. C++STL学习笔记(4) 分配器(Allocator)

    在前面的博客<C++ STL学习笔记(3) 分配器Allocator,OOP, GP简单介绍>中,简单的介绍了分配器再STL的容器中所担当的角色,这一节对STL六大部件之一的分配器进行详细 ...

  4. C++ STL学习笔记(3) 分配器Allocator,OOP, GP简单介绍

    继续学习侯捷老师的课程! 在前面的博客<C++ STL学习笔记(2) 容器结构与分类>中介绍了STL中常用到的容器以及他们的使用方法,在我们使用容器的时候,背后需要一个东西支持对内存的使用 ...

  5. 笔记-Codeforces比赛

    笔记-Codeforces比赛 文章讲的是 Codeforces\texttt{Codeforces}Codeforces 的使用,所以需要先注册登入. 简介 Codeforces\texttt{Co ...

  6. 【Python基础】Pandas笔记---通过比赛整理出的10条Pandas实用技巧

    点击上方"潜心的Python小屋"关注我们,第一时间推送优质文章. 前言 大家好,我是潜心.最近还在参加某比赛,将pandas对数据预处理的方法进行了总结,以下列出的10条是我觉得 ...

  7. C++ STL学习笔记 : 1. template 模板函数

    本篇文章是学习C++ STL库的第一篇笔记,主要记录了使用template关键字创建模板函数的方法. 下面用一个非常简单的例子解释模板函数的用法 : #include <iostream> ...

  8. 【C++ STL学习笔记】C++ STL序列式容器(array,vector,deque,list)

    文章目录 C++ STL容器是什么? 迭代器是什么,C++ STL迭代器(iterator)用法详解 迭代器类别 迭代器的定义方式 C++序列式容器(STL序列式容器)是什么 容器中常见的函数成员 C ...

  9. STL学习笔记(一)

    2019独角兽企业重金招聘Python工程师标准>>> 1. 容器(Containers) 容器分为两类: 序列式容器(Sequence containers),此乃可序群集,其中每 ...

  10. SGI STL 学习笔记二 vector

    sequence containers Array Vector Heap Priority_queue List sList(not in standard) Deque Stack Queue S ...

最新文章

  1. 找java培训机构如何挑选
  2. AI解译遥感影像,商汤的“黑科技”了解一下
  3. 为什么你写的代码糟透了?
  4. CLR 4.0 有哪些新东西? -- 类型等价
  5. 【MYSQL命令】查看一个表的建表语句
  6. sap gateway development mode
  7. 计算机维修与维护入门,计算机组装与维护基础知识
  8. http请求POST方式发送获得返回值
  9. C++ 普通函数和模板函数调用规则
  10. 经典水晶报表设计三则
  11. 如何安装SQL server 2000 SP4补丁
  12. 中兴e9000服务器,ZXCTN 9000-E设备系列_ZXCTN 9000-E系列中兴传输设备_中兴设备 - 诺深达华为光端机...
  13. linux下载navicat
  14. 联通手机卡网速的修改
  15. 中国脑计划颠覆性创新之路四,用脑科学预测互联网的未来发展趋势
  16. html 5标签读音,radish读音
  17. 重要:QA和QC的区别
  18. yii2 aliases web.php,别名(Aliases) - Yii2 权威指南
  19. WICC | 风口之下,音视频社交出海的三大新机遇
  20. python unicode码转换_python实现unicode转中文及转换默认编码的方法

热门文章

  1. 网易新闻iOS版开发使用的第三方框架和组件列表
  2. 开源版多用户博客系统
  3. MySQL中多表的连接
  4. localdatetime 格式化_LocalDateTime取代Data处理时间问题
  5. 从其他项目中复制过来的mapper加载不进bean_手把手带你玩转k8s-一键部署springboot项目...
  6. curl basic 认证
  7. Mybaitis框架与Spring整合详解(三)
  8. Java基础,不需要复杂语句,使用for循环实现求出1~100之间的奇数和以及偶数和,超级简单
  9. php 上标,PHP数组上标类型陷阱
  10. JS中使用MD5进行字符串加密