zoukankan      html  css  js  c++  java
  • c++stl应用入门

    在这篇中,我会讲几个简单易懂且比较常用的stl函数,这些函数在noip系列考试中往往被允许使用(既然让用我们自然不用手码了...)

    (末尾有惊喜!)

    1.sort

    绝大部分刚入门的oier第一个接触的stl函数就是sort函数,这是一个简单而又快速的排序函数

    通过内部集成的快速排序的代码,可以在O(nlogn)的时间内完成一个长度为n的数列的排序(默认排序方向为由小到大)

    实现起来非常简单,代码就一行(例子为排序x[1]~x[5]):

    sort(x+1,x+5+1);//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(映射,表示两个数据间的关系),为了对新手更为友好,我就暂时不讲。

  • 相关阅读:
    Java Properties 类读配置文件保持顺序
    mysql在增加列前进行判断该列是否存在
    java中用jdom创建xml文档/将数据写入XML中
    JavaFX 简介
    ActiveMQ详细入门使用教程
    Jquery Pagination分页插件使用
    Jquery选择器总结
    自己4月份面试的一些总结
    Java面试题全集(下)转载
    Java面试题全集(上)转载
  • 原文地址:https://www.cnblogs.com/ztz11/p/9296584.html
Copyright © 2011-2022 走看看