STL初步讲解

文章目录

    • sort
    • map
    • vector
    • stack
    • queue
      • priority_queue

初学C++,发现经常在文件中有using namespace std这个东西。

首先 namespace 这个东西叫做命名空间。using有好几种用法,这里使用的是using的命名空间的使用。
std是C++中的一个命名空间,叫做标准命名空间。C++标准库中的函数或者对象都是在命名空间std中定义的,
所以我们要使用标准函数库中的函数或对象都要使用std来限定。通俗的讲就是说 我们平常用的标准库中的cout,cin其实都是

sort

语法
sort(start,end,cmp)
(1) start表示要排序数组的起始地址;
(2) end表示数组结束地址的下一位;
(3) cmp用于规定排序的方法,可不填,默认升序。
[start,end)
less< int >()为升序,greater< int >()为降序
平均时间复杂度为O(nlogn)

#include <stdio.h>
#include <algorithm>
#include <functional>
using namespace std;
const int maxn=10;
int arr[maxn+5]={1,2,3,4,5,6,7,8,9,10};
int main(){sort(arr,arr+10,greater<int>());for(int i=0;i<10;i++) printf("%d ",arr[i]);return 0;
}

map

map是STL的一个关联容器,它提供一对一的hash。

第一个可以称为关键字(key),每个关键字只能在map中出现一次;
第二个可能称为该关键字的值(value);
2,map的功能

自动建立key - value的对应。key 和 value可以是任意你需要的类型,包括自定义类型。

// 定义一个map对象
map<int, string> mapStudent;// 第一种 用insert函數插入pair
mapStudent.insert(pair<int, string>(000, "student_zero"));// 第二种 用"array"方式插入
mapStudent[123] = "student_first";
mapStudent[456] = "student_second";
//迭代器刪除
map<int, string>::iterator iter;
iter = mapStudent.find("123");
mapStudent.erase(iter);//用关键字刪除
int n = mapStudent.erase("123"); //如果刪除了會返回1,否則返回0//用迭代器范围刪除 : 把整个map清空
mapStudent.erase(mapStudent.begin(), mapStudent.end());
//等同于mapStudent.clear()

map的遍历

#include<iostream>
#include<map>
using namespace std;
int main(){map <int ,string> mp;mp.insert(pair<int,string>(1,"a"));mp.insert(pair<int,string>(2,"b"));mp[2]="c";mp[4]="d";//创建对应类型的迭代器map<int, string>::iterator iter;  //调用map中的begin()和end()函数,使得迭代器指针能够遍历整个map容器for(iter = mp.begin(); iter != mp.end(); iter++)  //其中iter->frist为map中的key,iter->second为map中的valuecout<<iter->first<<' '<<iter->second<<endl;  return 0;
} 

map中数据的查找
用find函数来定位数据出现位置,它返回的一个迭代器,当数据出现时,它返回数据所在位置的迭代器,如果map中没有要查找的数据,它返回的迭代器等于end函数返回的迭代器。

#include<iostream>
#include<map>
using namespace std;
int main(){map <int ,string> mp;mp.insert(pair<int,string>(1,"a"));mp.insert(pair<int,string>(2,"b"));mp[3]="c";mp[4]="d";map<int, string>::iterator iter;  for(iter = mp.begin(); iter != mp.end(); iter++)  cout<<iter->first<<' '<<iter->second<<endl;  //查找//注意find函数中传的是要查找的元素的keyiter = mp.find(2);if(iter!=mp.end()){cout<<iter->second<<endl;}else{cout<<"not find"<<endl;}return 0;
} 

基本操作函数

 9,map的基本操作函数:C++ maps是一种关联式容器,包含“关键字/值”对begin()         返回指向map头部的迭代器clear()        删除所有元素count()         该数据是否存在,存在返回1,不存在返回0empty()         如果map为空则返回trueend()           返回指向map末尾的迭代器equal_range()   返回特殊条目的迭代器对erase()         删除一个元素find()          查找一个元素get_allocator() 返回map的配置器insert()        插入元素key_comp()      返回比较元素key的函数lower_bound()   返回键值>=给定元素的第一个位置max_size()      返回可以容纳的最大元素个数rbegin()        返回一个指向map尾部的逆向迭代器rend()          返回一个指向map头部的逆向迭代器size()          返回map中元素的个数swap()           交换两个mapupper_bound()    返回键值>给定元素的第一个位置value_comp()     返回比较元素value的函数

vector

在c++中,vector是一个十分有用的容器。

作用:它能够像容器一样存放各种类型的对象,简单地说,vector是一个能够存放任意类型的动态数组,能够增加和压缩数据。

vector在C++标准模板库中的部分内容,它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库。
使用方法:

vector<int>test;//建立一个vectortest.push_back(1);test.push_back(2);//把1和2压入vector,这样test[0]就是1,test[1]就是2
vector<vector<Point2f> > points; //定义一个二维数组points[0].size();  //指第一行的列数

1 、基本操作

(1)头文件#include.

(2)创建vector对象,vector vec;

(3)尾部插入数字:vec.push_back(a);

(4)使用下标访问元素,cout<<vec[0]<<endl;记住下标是从0开始的。

(5)使用迭代器访问元素.

vector::iterator it;

for(it=vec.begin();it!=vec.end();it++)

cout<<*it<<endl;

(6)插入元素: vec.insert(vec.begin()+i,a);在第i+1个元素前面插入a;

(7)删除元素: vec.erase(vec.begin()+2);删除第3个元素

vec.erase(vec.begin()+i,vec.end()+j);删除区间[i,j-1];区间从0开始

(8)向量大小:vec.size();

(9)清空:vec.clear();
四、几种重要的算法,使用时需要包含头文件:

#include
(1)sort(a.begin(),a.end()); //对a中的从a.begin()(包括它)到a.end()(不包括它)的元素进行从小到大排列
(2)reverse(a.begin(),a.end()); //对a中的从a.begin()(包括它)到a.end()(不包括它)的元素倒置,但不排列,如a中元素为1,3,2,4,倒置后为4,2,3,1
(3)copy(a.begin(),a.end(),b.begin()+1); //把a中的从a.begin()(包括它)到a.end()(不包括它)的元素复制到b中,从b.begin()+1的位置(包括它)开 始复制,覆盖掉原有元素
(4)find(a.begin(),a.end(),10); //在a中的从a.begin()(包括它)到a.end()(不包括它)的元素中查找10,若存在返回其在向量中的位置

二维vector
vector < vector > a; // a是向量类型的向量

for (j = 0; j < row; j++){for (i = 0; i <column; i++){a[j].push_back(i+j);}}
for (i = 0; i < a.size(); i++){for (j = 0; j < a[i].size(); j++){cout << a[i][j] << " ";  }cout << endl; // 输出一行就换行 }

stack

先进后出(FILO)的数据结构。
c++ stl栈stack的头文件为:

#include

c++ stl栈stack的成员函数介绍

操作 比较和分配堆栈

empty() 堆栈为空则返回真

pop() 移除栈顶元素

push() 在栈顶增加元素

size() 返回栈中元素数目

top() 返回栈顶元素

queue

一.queue模版类的定义在头文件中。

queue与stack模版非常类似,queue模版也需要定义两个模版参数,一个是元素类型,一个是容器类型,元素类型是必要的,容器类型是可选的,默认为dqueue类型。
定义queue对象的示例代码如下:
queueq1;
queueq2;
queue的基本操作有:
1.入队:如q.push(x):将x元素接到队列的末端;
2.出队:如q.pop() 弹出队列的第一个元素,并不会返回元素的值;
3,访问队首元素:如q.front()
4,访问队尾元素,如q.back();
5,访问队中的元素个数,如q.size();

priority_queue

用法:#include
定义:priority_queue q;(队头最大)
priority_queue<int,vector,greater > q; (队头最小)
也可以对struct使用,重载struct的<即可。
功能:
函数 功能
q.top() 队头
q.pop() 弹出队头
q.push() 加入队列
q.empty() 是否为空

priority_queue<int ,vector,cmp>pq


struct cmp{bool operator()(const int a,const int b)const{retrun a>b;//这里是实现一个“个位数大的整数优先级小”的优先队列}
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/318522.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

.NET Core微服务之路:让我们对上一个Demo通讯进行修改,完成RPC通讯

最近一段时间有些事情耽搁了更新&#xff0c;抱歉各位了。上一篇我们简单的介绍了DotNetty通信框架&#xff0c;并简单的介绍了基于DotNetty实现了回路&#xff08;Echo&#xff09;通信过程。我们来回忆一下上一个项目的整个流程&#xff1a;当服务端启动后&#xff0c;绑定并…

洛谷:P1831 杠杆数(数位dp)

文章目录描述解析代码thanks for reading&#xff01;传送门描述 如果把一个数的某一位当成支点&#xff0c;且左边的数字到这个点的力矩和等于右边的数字到这个点的力矩和&#xff0c;那么这个数就可以被叫成杠杆数。 比如4139就是杠杆数&#xff0c;把3当成支点&#xff0c…

2021“MINIEYE杯”中国大学生算法设计超级联赛(7)部分题解

前言 找大佬嫖到个号来划水打比赛了&#xff0c;有的题没写或者不是我写的就不放了。 目前只有&#xff1a;1004,1005,1007,1008,1011 正题 题目链接:https://acm.hdu.edu.cn/contests/contest_show.php?cid990 1004 Link with Balls 题目大意 两种盒子各有nnn个&#xff…

Visual Studio 2019 首个预览版本抢先看,有啥新功能?

微软在 Connect 2018 大会上发布Visual Studio 2019 第 1 个预览版本。该预览版本中展示了许多变更&#xff0c;从 IDE 的启动行为&#xff0c;到代码重构功能&#xff1b;从搜索功能的更多用法&#xff0c;到更好的大型项目导航。这个预览版本展现了微软希望尽全力帮助开发人员…

模板:网络流(Dinic算法)

文章目录1.网络最大流题目描述解析反悔边分层&#xff08;避免环流&#xff09;时间优化代码2.费用流描述解析代码1.网络最大流 洛谷P3376 题目描述 给出一个网络图&#xff0c;以及其源点和汇点&#xff0c;求出其网络最大流。 解析 网络流的思想就是在原有的基础上不断进…

NC51272 棋盘覆盖

题目&#xff1a; 给出一张nn(n≤100) 的国际象棋棋盘&#xff0c;其中被删除了一些点&#xff0c;问可以使用多少1*2的多米 诺骨牌进行掩盖。 题解&#xff1a; 先进行黑白染色&#xff0c;相邻的两个黑白就是一个骨牌&#xff0c;又因为一个格子不能放多个骨牌&#xff0c;…

P5494-[模板]线段树分裂

正题 题目链接:https://www.luogu.com.cn/problem/P5494 题目大意 给出一个可重集合要求支持 将集合ppp中在[l,r][l,r][l,r]的数放到一个新的集合中将集合ttt的所有数放入集合ppp中在集合ppp中放入xxx个ppp查询集合ppp中在[l,r][l,r][l,r]区间的数查询集合ppp中第kkk小的数 …

暑期训练待补

2021牛客暑期多校训练营5 C-Cheating and Stealing 繁琐 F-Finding Points 计算几何 I-Interval Queries 回滚莫队链表 2021牛客暑期多校训练营6 D-Gambling Monster FWT G-Hasse Diagram min25筛 2021牛客暑期多校训练营7 A-xay loves connected graphs多项式&#xff1f…

微软推出 VS Code 新特性,为 TypeScript 和 JavaScript 用户提供 AI 辅助开发功能

除了开发人员非常喜欢的IntelliSense和代码完成之外&#xff0c;今年早些时候&#xff0c;微软还发布了IntelliCode&#xff0c;提供了一组 AI 辅助开发功能。VS Code 团队现在宣布了一项新的实验性扩展&#xff0c;将 IntelliCode 带给了 TypeScript 和 JavaScript 用户。VS C…

NC107617 poj3020 Antenna Placement

问题&#xff1a; n * m的矩阵&#xff0c;有一些障碍点&#xff0c;用12的骨牌覆盖所有非障碍点 (12骨牌可重叠&#xff0c;骨牌可越界&#xff0c;骨牌可延伸到障碍点) 问最少需要 多少个。 题解&#xff1a; • 尽量用一个骨牌覆盖两个格子&#xff0c;覆盖不了了再重叠使…

P7737-[NOI2021]庆典【tarjan,虚树】

正题 题目链接:https://www.luogu.com.cn/problem/P7737 题目大意 给出一张无向图满足若x⇒z,y⇒zx\Rightarrow z,y\Rightarrow zx⇒z,y⇒z那么有x⇒yx\Rightarrow yx⇒y或y⇒xy\Rightarrow xy⇒x。 qqq次询问给出起点和终点和kkk条临时的边&#xff0c;求可能经过点的数量 1…

货车运输(洛谷P1967)(倍增)

传送门 文章目录题目描述题目解析代码题目描述 题目解析 本题如果告诉你&#xff0c;城市形成了一棵树&#xff0c;是不是就迎刃而解了呢? 本题的关键就是把稠密图转化为一片森林&#xff08;就是可能有很多棵树啦&#xff09; 怎么转化呢? 考虑哪些边是没用的 如果AB已经可…

.NET Core实战项目之CMS 第十一章 开发篇-数据库生成及实体代码生成器开发

上篇给大家从零开始搭建了一个我们的ASP.NET Core CMS系统的开发框架&#xff0c;具体为什么那样设计我也已经在第十篇文章中进行了说明。不过文章发布后很多人都说了这样的分层不是很合理&#xff0c;什么数据库实体应该跟仓储放在一起形成领域对象&#xff0c;什么ViewModel应…

P7736-[NOI2021]路径交点【LGV引理】

正题 题目链接:https://www.luogu.com.cn/problem/P7736 题目大意 有kkk层的图&#xff0c;第iii层有nin_ini​个点&#xff0c;每层的点从上到下排列&#xff0c;层从左到右排列。再给出连接相邻层的一些有向边&#xff08;从iii层连向i1i1i1层&#xff09;。 对于n1n_1n1​…

第1节 连通性强连通、割点和桥(一)

文章目录无向图割点、桥、双连通分量Tarjan算法求割点和桥&#xff08;割边&#xff09;代码&#xff1a;边双连通分量 和 点双连通分量代码边双连通分量 和 点双连通分量 的缩点有向图的弱连通与强连通强连通分量Kosaraju算法Tarjan算法代码&#xff1a;无向图割点、桥、双连通…

暗黑破坏神(背包)(内部模拟)

不开longlong见祖宗&#xff01;&#xff01;&#xff01; scanf要打成lld&#xff01;&#xff01;&#xff01;&#xff01; 解析 分层背包的类板子题&#xff0c;更新dp过程中记录路径&#xff0c;最后递归输出即可 然而—— 一开始被卡成了27分&#xff01;&#xff01;…

UOJ#454-[UER #8]打雪仗【通信题】

正题 题目链接:https://uoj.ac/problem/454 题目大意 AliceAliceAlice有一个长度为2n2n2n的010101串&#xff0c;BobBobBob有nnn个在[1,2n][1,2n][1,2n]位置的下标表示它想要得到010101串中这些位置的值&#xff0c;现在两个人可以向对方传输不超过mmm个0/10/10/1字符&#xf…

第1节 连通性强连通、割点和桥 例题

NC15707 可达性 题目&#xff1a; 给出一个 0 ≤ N ≤ 105 点数、0 ≤ M ≤ 105 边数的有向图&#xff0c; 输出一个尽可能小的点集&#xff0c;使得从这些点出发能够到达任意一点&#xff0c;如果有多个这样的集合&#xff0c; 输出这些集合升序排序后字典序最小的。 题解:…

最大乘积(记忆化搜索)

题目描述 给一段数列&#xff0c;用k个乘号分开&#xff0c;求所得最大值 n<10! 解析 这样就不用写高精啦 枚举第一个乘号的位置递归记忆化搜索即可 问题&#xff01; 一开始边界条件写了一个这个&#xff1a; if(n-st<k) return -2e15;这样使这样的情况强制非法 但…

Loj#6503-「雅礼集训 2018 Day4」Magic【分治NTT】

正题 题目链接:https://loj.ac/p/6503 题目大意 nnn张卡mmm种&#xff0c;第iii种卡有aia_iai​张&#xff0c;求所有排列中有kkk对相邻且相同的卡牌。 1≤n≤105,0≤k≤105,1≤m≤20000,∑i1main1\leq n\leq 10^5,0\leq k\leq 10^5,1\leq m\leq 20000,\sum_{i1}^ma_in1≤n≤1…