c++stl应用入门
在这篇中,我会讲几个简单易懂且比较常用的stl函数,这些函数在noip系列考试中往往被允许使用(既然让用我们自然不用手码了...)
(末尾有惊喜!)
1.sort
绝大部分刚入门的oier第一个接触的stl函数就是sort函数,这是一个简单而又快速的排序函数
通过内部集成的快速排序的代码,可以在O(nlogn)的时间内完成一个长度为n的数列的排序(默认排序方向为由小到大)
实现起来非常简单,代码就一行(例子为排序x[1]~x[5]):
sort(x+,x++);//x表示你要排序的数组名,x+1表示从1开始(因为数组开始的默认下标为0)
//x+5+1表示到5结束(为什么要+1呢?因为我们要等于5,如果不+1的话意思是小于5的,自然就没有x[5]了)
但同时,很多人会发现,你不是说这是默认由小到大的吗?我要从大到小该怎么办呢?
这时候我们有两种选择:你可以重载运算符,也可以写一个比较函数
(前一个比较麻烦,我在下面一个讲优先队列时说)
我在这里先说一下比较函数
顾名思义,这个比较函数的作用就是告诉sort函数,我在排序时要怎样对待每两个元素
我们可以看一下这个比较函数的主体:

有了这个,我们就能让sort随心所欲!
总结:
函数名:sort
用途:排序一个数组
头文件:#include<algorithm>
用法:sort(x+起始位置,x+终止位置+1,比较函数)(没有特殊需要比较函数可以省略)
2.优先队列
(在这个部分里,请大家默认将优先队列当成堆)
大家玩过堆排序吗?
优先队列,其实就是堆排序,不过用起来会更方便(和上面一样,一个函数与一行代码的区别)
和sort拿来就能用不同,由于这是一个队列,需要存东西,所以在使用前,我们需要声明一下
比如说我要开一个堆,那我要这么做:

很简单,不是吗?那我们又该如何使用这个队列呢?
下面我讲几个操作:
1.插入元素
我们可以这样写:
q.push(val);
q在这里代表队列名称,push是插入的意思,val则是你要插入的值
在这里我们要特别注意,val的类型必须和我们声明的优先队列的类型相同
(好像有时候队列定义是long long你插个int也无所谓),但如果你定义的是int,但你从插的是个double,那么这个double会被强制取整
如果你定义的是结构体,你直接插入结构体就行(队列会自动将结构体的每一个元素都插进去)
2.找堆顶
我们可以这样写:
int a=q.top();
这里的意思是定义一个整数为该堆的堆顶(不只是int,你定义的堆是什么类型,他就给你返回什么类型)
堆顶是什么取决于你如何重载运算符,(不过默认是大根堆)
3.删除堆顶
我们可以这样写:
q.pop();
这句话表示堆顶元素出队,然后程序会自动维护整个堆,使其仍满足堆的性质
4.查询堆的大小
我们可以这样写:
int a=q.size();
进行这个操作后a就代表堆的大小
该讲讲最重头的了——重载运算符
重载运算符的作用就是改变某个序列中符号的定义
首先明确,在优先队列里,由于他默认的是大根堆,所以我们重载大于号
依个人所见,如果你要将非结构体的大根堆变为小根堆,是不需要重载运算符的
我们只要在入队时取反,出队时取反即可(负负得正)
重载运算符,(我可能比较蒟蒻)一般重载的对象是结构体
我们一般这样写:

通过这样一个函数,我们可以改变结构体数组中某些符号的含义,自然两两比较方式也就发生了改变
这个堆自然也就可以比较别的东西了
总结:
头文件:#include<queue>
定义方法:priority_queue<int(数据类型)> q(队列名)
用途:进行堆排序,构建一个二叉堆(至于有了堆能干什么,就看你们了)
操作:
push():插入元素
top():返回堆顶元素的值
pop():删除堆顶元素
size():返回当前堆的大小
变形方式:重载运算符
3.杂项
本来这个地方想放vector的,但感觉好像并没有什么卵用,于是我讲一讲杂项。
【1】 memset 数组初始化操作:
memset功能强大,但我在这里只讲如何利用memset归零一个数组
看图:

就是这样,是不是很简单?
总结:
函数名:memset
头文件:#include<cstring>
用途:初始化数组
用法:memset(数组名,初始值,大小);
【2】 strlen字符数组长度统计
有的时候,我们会遇到需要读取一个不定长的字符串(比如说有的题让你匹配字符串,像kmp,hash之类的)
我们就需要用一点手段获取字符串的长度(当然,你别告我拿个循环跑,你多跑几次就发现代码行满了)
我们请出strlen()函数
这个函数的作用就是读取一个字符串,并返回这个字符串的长度
看图:

通过如上函数,我们可以解决字符串的长度问题。
总结一下:
函数名:strlen
头文件:#include<cstring>
用途:统计字符数组长度
用法:定义一个整数=strlen(你要统计长度的数列)
入门级c++stl到此结束,其实比较简单的还有vector(变长数组),set(平衡树,内部实现是一棵红黑树),map(映射,表示两个数据间的关系),为了对新手更为友好,我就暂时不讲。
c++stl应用入门的更多相关文章
- 转:STL使用入门( Using STL)
1 介绍 我最开始结束C++编程是从DOS下的Borland C++开始的.那时他们在最新版本3.1中就包含了一套模板库用来做collection.那真是个好东东.当我开始使用Visual C++ 2 ...
- 【转】C++ STL快速入门
转自:https://www.cnblogs.com/skyfsm/p/6934246.html 冠军的试炼 悟已往之不谏,知来者之可追 博客园 首页 新随笔 联系 订阅 管理 随笔 - 60 文章 ...
- C++ STL标准入门
C++:STL标准入门汇总 第一部分:(参考百度百科) 一.STL简介 STL(Standard Template Library,标准模板库)是惠普实验室开发的一系列软件的统称.它是由Alexand ...
- C++ STL快速入门
在数月之前的机试中第一次体验到STL的威力,因为自己本来一直在用C语言做开发,很多数据结构都是自己造的,比如链表.队列等,第一次接触C++ STL后发现这些数据结构都已经给我提供好了,我直接拿去调用就 ...
- 『C++』STL容器入门
最近在学习opencv,因为C++基础很烂,所以遇到了不少问题,其中STL模块也是没少接触,特此简单了解一下STL的容器类型(主要是Vector)和迭代器的简单用法. C++ STL(标准模板库)是一 ...
- C++STL快速入门学习
C++ STL中最基本以及最常用的类或容器无非就是以下几个: string vector set list map 下面就依次介绍一下它们,并给出一些最常见的使用方法,做到最快入门. string 首 ...
- (转载)C++:STL标准入门汇总
(转载)http://www.cnblogs.com/shiyangxt/archive/2008/09/11/1289493.html 学无止境!!! 第一部分:(参考百度百科) 一.STL简介 S ...
- [GeekBand] STL 仿函数入门详解
本文参考文献::GeekBand课堂内容,授课老师:张文杰 :C++ Primer 11 中文版(第五版) page 37 :网络资料: 叶卡同学的部落格 http://www.leavesite. ...
- 【转载】C++ STL快速入门
https://www.cnblogs.com/skyfsm/p/6934246.html
随机推荐
- VS2015自定义类模板的方法
在前一段时间忽然想给自己电脑上的vs新建类的时候添加一个自定义个注释,但是在网上搜了很久都是说vs2012之类的方法系统也都是win7.XP之类的独独没有win8的.故此自己不断的尝试修改发现方法如下 ...
- Mac 10.11.4 安装mysql-5.7.13 默认密码问题
今天下载了一个最新版的mysql dmg安装包来安装mysql,安装的整个过程竟然都没有提示输入root用户默认密码,我也没太在意,然后连接数据库时竟然提示输入密码,当时就一脸懵逼了.尝试各种密码,为 ...
- 多结果集IMultipleResult接口
在某些任务中,需要执行多条sql语句,这样一次会返回多个结果集,在应用程序就需要处理多个结果集,在OLEDB中支持多结果集的接口是IMultipleResult. 查询数据源是否支持多结果集 并不是所 ...
- The twentyth day
10th Dec 2018 Cause It's hard for me to lose in my life I've found 因为失去你是一种煎熬 Only time will tell a ...
- Objective C 中的nil,Nil,NULL和NSNull理解
kenyo网友的原创说法是:做IOS开发的估计都对Objective-C的内存管理机制很头疼,一不小心程序就会出内存泄露,我也不例外,前几天被指针的置nil与release给搞惨了,今和大家详细解说一 ...
- 使用auto_ptr需要注意的事项
注:C++11 已不推荐使用,应使用scoped_ptr/shared_ptr. 部分原因就是如下的注意事项. 转自:http://patmusing.blog.163.com/blog/static ...
- AMOLED原理介紹
1. OLED发光原理 OLED(Organic Light Emitting Display,有机发光显示器)是指有机半导体材料在电场驱动下,通过载流子注入和复合导致发光的现象.其基本原理是用ITO ...
- 缓存溢出Buffer Overflow
缓存溢出(Buffer overflow),是指在存在缓存溢出安全漏洞的计算机中,攻击者可以用超出常规长度的字符数来填满一个域,通常是内存区地址.在某些情况下,这些过量的字符能够作为“可执行”代码来运 ...
- [图]Windows 10 Build 16273版本更新发布:新增可变式字体Bahnschrift
在经历了长达三周的等待之后,微软于今天终于面向Windows Insider项目的Fast通道用户发布了Windows 10 Build 16273版本更新.事实上,微软应该会在两周前就应该发布新版本 ...
- ubuntu 18 下配置 WebStorm 编译 sass
ubuntu 18 下配置 WebStorm 编译 scss 标签(空格分隔): IDE 安装Ruby: sudo apt-get install ruby ruby -v ruby 2.5.1p57 ...