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

发布于 2020-02-16  144 次阅读


使用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()给出一个序列在全排列的下一个序列。
什么是全排列?下面给出一张图,或许更好理解
20200216165920.png

举个栗子:

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;
}

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

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

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


正因为有要好好实现的梦想,所以今天也要好好加油。