专栏首页细嗅蔷薇STL中algorithm头文件下的常用函数

STL中algorithm头文件下的常用函数

使用algorithm需要在头文件下加using namespace std;才能使用

max()、min()和abs()

max(x,y)与min(x,y):返回x和y的最大值和最小值(必须两个参数,可以是浮点数)。

如果要返回三个数的最大值,则可以使用max(x,max(y,z))的写法

*abs(x)返回x的返回值

x必须是整数int。 浮点数请使用math头文件下的fabs。

swap()

swap(x,y)用来交换x和y的值

示例:

......
int main(){
    int x = 1, y = 2;
    swap(x,y);
    printf("%d %d"\n, x, y);//输出2  1
    ......
}

reverse()

reverse(it1,it2):将数组指针在[it1,it2)之间的元素或容器的迭代器在[it1,it2)范围内的元素进行反转。

如果是reverse(a,a+4),则是将a[0]~a[3]反转。

示例(反转数字):

......
int main(){
    int a[10] =  {10, 11,12, 13, 14, 15};
    reverse(a, a + 4);
    for(int i = 0; i < 6; i++){
        printf("%d",a[i]);//输出 13 12 11 10 14 15
    }
}

示例(反转字符串,即反转容器中的元素):

......
int main(){
    string str = "abcdefghi";
    reverse(str.begin() + 2, str.begin() + 6);//将str字符串中的2号位到5号位反转
    for(int i = 0; i < str.length(); i++){
        printf("%c",str[i]);//输出abfedcghi
    }
}

next_permutation()

next_permutation()给出一个序列在全排列的下一个序列。 什么是全排列?下面给出一张图,或许更好理解

举个栗子:

n = 3时的全排列:123、132、213、231、312、321。 这样231的下一个序列位312

示例:

......
//输出n=3的全排列
int main(){
    int a[10] = {1, 2, 3};
    do{
        printf("%d%d%d",a[0], a[1], a[2]);
    }while(next_premutation(a, a+3));
}

fill()

fill():把数组或容器中的某一段区间赋成相同的值。和memset不同,这里的赋值可以时数组类型对应范围中的任意值。

sort()

请详见这篇文章。

lower_bound()和upper_bound()

lower_bound():用来寻找在数组或容器中[first,last)范围内的第一个值大于等于val的元素的位置。

如果是数组,则返回该位置的指针。 如果是容器,则返回返回该位置的迭代器。

upper_bound:用来寻找在数组或容器中[first,last)范围内的第一个值大于val的元素的位置。

数组和容器如上面同样返回该位置的各自对应的东西。

lower_bound()和upper_bound()的实现详见这篇文章。

显然,如果数组或容器没有需要寻找的元素,则lower_bound()和upper_bound()均返回该元素的位置的指针或迭代器(即假设存在该元素时,该元素应当在的位置)。

lower_bound()和upper_bound()的复杂度均为O(log(last-first))。

示例:

#include<stdio.h>
#include<algorithm>
using namespace std;
int main(){
    int a[10]={1, 2, 2, 3, 3, 3, 5, 5, 5, 5};
    //寻找-1
    int *lowerPos = lower_bound(a, a + 10, -1);
    int *upperPos = upper_bound(a, a + 10, -1);
    printf("%d, %d", lowerPos - a, upperPos - a);//输出 0 0
    //寻找3
    int *lowerPos = lower_bound(a, a + 10, 3);
    int *upperPos = upper_bound(a, a + 10, 3);
    printf("%d, %d\n", lowerPos - a, upperPos - a);// 输出 3 6
    //可以想一下上面“lowerPos - a”中的a的用处时什么?
}

如果只是想获得想要查找元素的下标,直接令返回值减去数组首地址即可,可以不使用临时指针lowerPod和upperPod。

示例:

#include<stdio.h>
#include<algorithm>
using namespace std;
int main(){
    int a[10] = {1, 2, 2, 3, 3, 5, 5, 5, 5};
    printf("%d, %d\n", lower_bound(a, a + 10, 3) - a, upper_bound(a, a + 10, 3) - a);// 输出 3 6
    return 0;
}

版权所有:可定博客 © WNAG.COM.CN

本文标题:《STL中algorithm头文件下的常用函数》

本文链接:https://wnag.com.cn/830.html

特别声明:除特别标注,本站文章均为原创,本站文章原则上禁止转载,如确实要转载,请电联:wangyeuuu@qq.com,尊重他人劳动成果,谢过~

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 简单随机算法

    (2)第一份代码中return randSelect(A, p + 1, right, K-M)为什么是K-M?

    lollipop72
  • Contest100000579 – 《算法笔记》3.5小节——入门模拟->进制转换

    http://codeup.cn/contest.php?cid=100000579

    lollipop72
  • C++快速补天

    (2)int型范围:-2^31~(2^31)-1,大致范围在-2*10^9~2*10^9(占用32bit/4Byte)

    lollipop72
  • 二分查找与二分答案(2)

    mathor
  • C# 中yield关键字解析

      前段时间了解到yield关键字,一直觉得还不错。今天给大家分享一下yield关键字的用法。yield return 返回集合不是一次性返回所有集合元素,而是...

    小世界的野孩子
  • 分享|C# 中yield关键字解析

      前段时间了解到yield关键字,一直觉得还不错。今天给大家分享一下yield关键字的用法。yield return 返回集合不是一次性返回所有集合元素,而是...

    Vaccae
  • sql server 字符串替换函数REPLACE

    乔达摩@嘿
  • Codeforces Round #539 (Div. 2) C. Sasha and a Bit of Relax(前缀异或和)

    题目链接:https://codeforces.com/contest/1113/problem/C

    Ch_Zaqdt
  • [译] 为什么你的应用需要对各种尺寸屏幕做适配优化?

    查看这些应用:Gameloft、Evernote、Slack、1Password 如何适配 Chrome OS 系统。

    Android 开发者
  • leetcode 一些算法题及答案

    给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。

    WindWant

扫码关注云+社区

领取腾讯云代金券