STL(C++)应用-创新互联
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//万能头
#include#include#include#include#include
#include#include#include#include#include
详细应有可看:C语言头文件_init33的博客-博客_c语言头文件
two.排序: 快排(sort): sort是STL中自带的排序函数 复杂度 O(n log n)格式:sort(要排序元素的起始地址,要排序元素的结束地址,比较函数);
代码:(从小到大)#includeusing namespace std;
int n,a[100010];
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<
从大到小:加一个判断函数即可#includeusing namespace std;
int f[100010],n;
int main() {
cin>>n;
for(int i=1;i<=n;i++) cin>>f[100010];
sort(f+1,f+n+1,greater());
for(int i = 1;i<=n;i++) cout<
或:#includeint n,f[100010];
bool cmp(int a,int b){ return a>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<
结构体排序:#includestruct node{int x,y,t;}p[100010];
bool cmp(node a,node b){return a.t>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<
three.容器
① map 写法:map<基本数据类型,基本数据类型>(不需要一样)Xmap常用于打标记 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;
举个例子:
mapp;
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 只含有两个元素,可以看作是只有两个元素的结构体。pairp[20]
cout<
⑥unique()去重 函数原型:unique(起始地址, 末尾地址, fun);
其中fun为自定义的函数名。
注意:unique函数去重并不是真正的去重,它是不断的将后面不重复的元素覆盖前面重复的元素,最后返回最后一个不重复的元素的地址。
如果要真的去重,需要erase();
代码:
#includeusing namespace std;
int main(){
vectorvec={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<
总结:STL真的''千奇百怪'',相信大家看完之后对STL会有更深的理解,如果有什么不足之处,欢迎大家指出。参考资料:STL(模板库)_360百科
【C++】STL应用(详解)_打代码能当饭吃?的博客-博客_c++stl基础及应用
C语言头文件详解_正在起飞的蜗牛的博客-博客_c语言头文件
c++STL库最详细介绍(保姆级教学)_我要取个特别特别特别特别特别特别长的名字的博客-博客_c++ stl库
c++常见的几种排序_假如我年少有为的博客-博客_c++排序
C++ map函数_Water_Coder的博客-博客_c++ map函数
C++中常用的std标准容器(全部容器功能介绍)_流楚丶格念的博客-博客_std 容器
STL函数大全_FoLiaGe丶的博客-博客_stl函数
【数据结构】栈(stack)-顺序栈(动态图解、c++、java)_URLeisure的博客-博客_进栈出栈顺序图解
c++stl库函数_列出C ++ STL(标准模板库)中的函数_cumtv80668的博客-博客
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧
网页标题:STL(C++)应用-创新互联
本文来源:http://scjbc.cn/article/gpshh.html