定义:
STL是Standard Template Library的简称。从根本上说,STL是一些"容器"的集合,这些"容器"有list,vector,set,map等,STL也是算法和其他一些组件的集合。
STL可分为容器(containers)、迭代器(iterators)、空间配置器(allocator)、配接器(adapters)、算法(algorithms)、仿函数(functors)六个部分。
STL结构图:
STL 应用
one.头文件:
include作用:在include的地方,把头文件里的内容原封不动的复制到引用该头文件的地方。
头文件引用:头文件引用有两种形式:#include < stdio.h> 和 include "main.h"。
用< >引用的一般是编译器提供的头文件,编译时会在指定的目录中去查找头文件。用" "引用的一般是自己写的头文件,编译时,编译器会在项目所在的文件夹中进行查找。
总结:系统提供的头文件用< >引用, 自己写的用” "引用。
格式:
#define XXX #ifndef XXX #endif
讯享网
常用头文件:
讯享网#include <bits/stdc++.h> //万能头 #include <iostream> #include <cstdio> #include <string> #include <cstdlib> #include <algorithm> #include <cmath> #include <cstring> #include <queue> #include <vector> #include <ctime>
详细应有可看:C语言头文件_init33的博客-CSDN博客_c语言头文件
two.排序:
快排(sort): sort是STL中自带的排序函数 复杂度 O(n log n)
格式:sort(要排序元素的起始地址,要排序元素的结束地址,比较函数);
代码:(从小到大)
#include<bits/stdc++.h> using namespace std; int n,a[]; int main(){ cin>>n; for(int i=1;i<=n;i++) cin>>a[i]; sort(a+1,a+n+1); for(int i=1;i<=n;i++) cout<<a[i]; return 0; }
从大到小:加一个判断函数即可
讯享网#include <bits/stdc++.h> using namespace std; int f[],n; int main() { cin>>n; for(int i=1;i<=n;i++) cin>>f[]; sort(f+1,f+n+1,greater<int>()); for(int i = 1;i <=n;i++) cout<<f[i]<<" "; return 0; }
或:
#include <bits/stdc++.h> int n,f[]; bool cmp(int a,int b){ return a<b;} int main() { cin>>n; for(int i=1;i<=n;i++) cin>>f[i]; sort(f+1,f+n+1,cmp); for(int i=1;i<=n;i++) cout<<f[i]<<" "; return 0; }
结构体排序:
讯享网#include <bits/stdc++.h> struct node{int x,y,t;}p[]; bool cmp(node a,node b){return a.t<b.t;} int n; using namespace std; int main() { cin>>n; for(int i=1;i<=n;i++) cin>>p[i].x>>p[i].y,p[i].t=p[i].y-p[i].x; sort(p+1,p+n+1,cmp); for(int i=1;i<=n;i++) cout<<p[i].x<<" "; return 0; }
three.容器
① map 写法:map<基本数据类型,基本数据类型>(不需要一样)X
map常用于打标记 map可以看作是一个无限长度的数组
基本构造函数:
map < string , int > mapstring; map < int , string > mapint; map < sring , char > mapstring; map < char , string > mapchar; map < char , int > mapchar; map < int , char > mapint;
举个例子:
讯享网map<string,int> p; int main(){ cin>>n; for(int i=1;i<=n;i++) cin>>s>>x,p[s]=x; cin>>y>>l; if(p[y]==l) cout<<"Yes"; else cout<<"No"; }
② vector 初始化 :vector<基本数据类型> k;
使用操作:
1. 属性操作
v1.size() //v1内已经存放的元素的数目 v1.capacity() // v1现有的在存储容量(不再一次进行扩张内存空间的前提下) v1.empty() // 判断v1是否为空 v1.max_size() // 返回vector可以存放的最大元素个数,一般这个数很大,因为vector可以不断调整容量大小。 v1.shrink_to_fit() // 该函数会把v1的capacity()的大小压缩到size()大小,即释放多余的内存空间。
2.访问操作
讯享网 v1[n] // 通过下标进行访问vector中的元素的引用 (下标一定要存在 ,否则未定义,软件直接崩了) v1.at(n) // 与上面类似,返回下标为n的元素的引用,不同的是,如果下标不存在,它会抛出out_of_range的异常。它是安全的,建议使用它。 v1.front() // 返回vector中头部的元素的引用(使用时,一定要进行非空判断) v1.back() // 返回vector中尾部的元素 引用(使用时,一定要进行非空判断)
3.添加操作
v1.push_back(a) //在迭代器的尾部添加一个元素 v1.push_front(a) // vector不支持这个操作 v1.insert(iter, a) // 将元素a 插入到迭代器指定的位置的前面,返回新插入元素的迭代器(在c++11标准之前的版本,返回void) v1.insert(iter, iter1, iter2) //把迭代器[iterator1, iterator2]对应的元素插入到迭代器iterator之前的位置,返回新插入的第一个元素的迭代器(在c++11标准之前的版本, 返回空)。
4.删除操作
讯享网v1.erase(iterator) // 删除人人迭代器指定的元素,返回被删除元素之后的元素的迭代器。(效率很低,最好别用) v1.pop_front() //vector不支持这个操作 v1.pop_back() //删除vector尾部的元素 , 返回void类型 (使用前,一定要记得非空判断) v1.clear() //清空所有元素
5.代替操作
v1.assign({初始化列表}) // 它相当于赋值操作, v1.assign(n, T) // 此操作与初始化时的操作类似,用个n T类型的元素对v1进行赋值 v1.assign(iter1, iter2) // 使用迭代器[iter1, iter2]区间内的元素进行赋值(该迭代器别指向自身就可以),另外,只要迭代器指的元素类型相同即可(存放元素的容器不同,例如:可以用list容器内的值对vector容器进行assign操作,而用 "=" 绝对做不到的。 v1.swap(v2) // 交换v1与v2中的元素。 swap操作速度很快,
③ 队列(queue) 先进先出 初始化:queue<基础类型> X
基本操作:
讯享网 q.push(x); //入队,将元素 x 从队尾插入(尾插法) q.pop(); //出队,删除对首元素,并返回其值 q.size(); //返回队中元素个数 q.front(); //返回对首元素 q.back(); //返回队尾元素 q.empty(); //判断是否为空(空返回 1,非空返回 0)
优先队列(priority_queue)是一种会按照默认或自定义的优先级进行自动排序的队列,其特点是优先级高的元素排在队首,低的排在队尾。
④ 栈(stack)
栈就像一个盒子,可以放入或去除元素,但是要把盒子底下的东西取出来,就必须先取出上面的东西。
生动动画:
图片来源:知乎:不淡定的小淡定


栈的定义:
stack<类型(可以不写)> st; 或者stack st;
函数:
讯享网代码 含义 push() 压栈,增加元素 O(1) pop() 移除栈顶元素 O(1) top() 取得栈顶元素(但不删除)O(1) empty 检测栈内是否为空,空为真 O(1) size() 返回stack内元素的个数 O(1)
⑤二分查找
A .lower_bound函数
查找的数组下标 = lower_bound(数组要查找的开始位置,数组要查找的结束位置后面,要找的数) – 数组开始位置(一般写数组名);
B.upper_bound函数 快速二分查找出第一个大于指定数的位置(下标)
C.binary_search:查找数组内某个元素是否出现。
void binary_search(数组首地址,结束地址,要查找的数)
返回值为bool类型,找到了返回true。
⑥pair 只含有两个元素,可以看作是只有两个元素的结构体。
pair<int,int> p[20] cout<<p[x].first<<p[x].second;
⑥unique()去重
函数原型:unique(起始地址, 末尾地址, fun);其中fun为自定义的函数名。
注意:unique函数去重并不是真正的去重,它是不断的将后面不重复的元素覆盖前面重复的元素,最后返回最后一个不重复的元素的地址。
如果要真的去重,需要erase();
代码:
讯享网#include<bits/stdc++.h> using namespace std; int main(){ vector<int> vec={1,1,2,3,3,4,4,5}; auto pos=unique(vec.begin(), vec.end()); vec.erase(pos, vec.end()); for(int v:vec) cout<<v<<' '; cout<<endl; return 0; }
总结:STL真的''千奇百怪'',相信大家看完之后对STL会有更深的理解,如果有什么不足之处,欢迎大家指出。
参考资料:
STL(模板库)_360百科
【C++】STL应用(详解)_打代码能当饭吃?的博客-CSDN博客_c++stl基础及应用
C语言头文件详解_正在起飞的蜗牛的博客-CSDN博客_c语言头文件
c++STL库最详细介绍(保姆级教学)_我要取个特别特别特别特别特别特别长的名字的博客-CSDN博客_c++ stl库
c++常见的几种排序_假如我年少有为的博客-CSDN博客_c++排序
C++ map函数_Water_Coder的博客-CSDN博客_c++ map函数
C++中常用的std标准容器(全部容器功能介绍)_流楚丶格念的博客-CSDN博客_std 容器
STL函数大全_FoLiaGe丶的博客-CSDN博客_stl函数
【数据结构】栈(stack)-顺序栈(动态图解、c++、java)_URLeisure的博客-CSDN博客_进栈出栈顺序图解
c++stl库函数_列出C ++ STL(标准模板库)中的函数_cumtv80668的博客-CSDN博客

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/47145.html