C++常用标准模板库——algorithm

algorithm
使用algorithm头文件,需要在头文件下面加一行“using namespace std”,才能使用。
algorithm的常用函数

(1) max(),min(),abs()
max(x,y)和min(x,y)分别返回x和y的最大值和最小值,且参数必须是两个(可以是浮点数),如果要返回三个数x,y,z的最大值,可以使用max(max(x,y),z)的写法。abs(x)返回x的绝对值。注意,x必须是整数,浮点型的绝对值要用math头文件下的fabs。

int x = -1, y = 2 ;
    cout << max(x,y) << ' ' << min(x,y) << endl ;
cout << abs(x) << ' ' << abs(y) << endl ;
输出结果:2 -1
1 2

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

int x = 3, y = 5 ;
    swap(x,y) ;
cout << "x = " << x << ",y = " << y << endl ;
输出结果:x = 5,y = 3

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

int v1[ ] = {3,1,2,5,4} ;
    vector<int> v2(v1,v1+5) ;
    reverse(v1,v1+5) ;
    reverse(v2.begin(),v2.begin()+2) ;
    for(auto ele : v1) cout << ele << ' ' ;
    cout << endl ;
    for(auto ele : v2) cout << ele << ' ' ;
cout << endl ;
输出结果:4 5 2 1 3
1 3 2 5 4

(4) next_permutation()
next_permutation()给出一个序列全排列中的下一个序列。使用的方式和reverse类似。
例如,当n==3时的全排列为
123,132,213,231,312,321,这样231的下一个序列就是312。

int a[ ] = {1,2,3} ;
    do{
        cout << a[0] << a[1] << a[2] << endl ;
}while(next_permutation(a,a+3)) ;
输出结果:123
132
213
231
312
321
            注意,这里要用do..while否则输出的结果中会少123这种情况。
 

(5) fill()
fill()函数可以把数组或者容器中的某一段区域赋为某个相同的值。和memset不同的是,这里的赋值可以是和数组类型对应范围中的任意值。

int a[ ] = {3,1,2,5,4} ;
    fill(a,a+2,888) ;
    for(auto e : a) cout << e << ' ' ;
cout << endl ;
输出结果:888 888 2 5 4
 

(6) sort()
sort()是用来排序的。sort()的使用方式是,sort(首元素地址(必填),尾元素地址的下一个地址(必填),比较函数(非必填))。如果不写比较函数,则默认对给出的区间进行递增排序。

int a[ ] = {3,1,2,5,4} ;
    sort(a,a+2) ;
    for(auto e : a) cout << e << ' ' ;
    puts(" ") ;
    sort(a,a+5) ;
    for(auto e : a) cout << e << ' ' ;
cout << endl ;
输出结果:1 3 2 5 4
1 2 3 4 5
实现从大到小排序(char,doubel等基本类型与int类似)

bool cmp(int a,int b){
    return a>b ;
}
int main(){
    int a[] = {3,1,2,5,4} ;
    sort(a,a+2,cmp) ;
    for(auto e : a) cout << e << ' ' ;
    puts("") ;
    sort(a,a+5,cmp) ;
    for(auto e : a) cout << e << ' ' ;
    cout << endl ;
    return 0 ;
}
输出结果:3 1 2 5 4
5 4 3 2 1
结构体的排序,具体看cmp的编写方式。

const int N = 5 ;
struct point{
    int x,y ;
}a[N];

bool cmp(point a,point b){
    return a.x>b.x ;
}
int main(){
    a[0].x = 2 ;
    a[0].y = 3 ;
    a[1].x = 1 ;
    a[1].y = 4 ;
    a[2].x = 2 ;
    a[2].y = 5 ;
    sort(a,a+3,cmp) ;
    for(int i=0;i<3;i++){
        printf("%d %d\n",a[i].x,a[i].y) ;
    }
    return 0 ;
}
输出结果:2 3
2 5
1 4
如果要按照x从大到小排序,在x相等的时候按照y从小到大排序。

struct point{
    int x,y ;
}a[N];

bool cmp(point a,point b){
    if(a.x != b.x) return a.x > b.x ;
    else return a.y < b.y ;
}

int main(){
    a[0].x = 2 ;
    a[0].y = 3 ;
    a[1].x = 1 ;
    a[1].y = 4 ;
    a[2].x = 2 ;
    a[2].y = 5 ;
    sort(a,a+3,cmp) ;
    for(int i=0;i<3;i++){
        cout << a[i].x << " " << a[i].y << endl ;
    }
    return 0 ;
}
输出结果:2 3
2 5
1 4
最后举个很有意思的例子,怎么样实现按照字符串的长度排序。

bool cmp(string str1,string str2){
    return str1.size() < str2.size() ;
}

int main(){
    string a[] = {"cccc","zz","bbb","aa"} ;
    sort(a,a+4,cmp) ;
    for(int i=0;i<4;i++){
        cout << a[i] << endl ;
    }
    return 0 ;
}
输出结果:zz
aa
bbb
cccc
实现了按照字符串的长度排序,但是如果当长度相同按字典序排,如何实现?

bool cmp(string str1,string str2){
    if(str1.size() != str2.size()) return str1.size() < str2.size() ;
    else return str1 < str2 ;
}

int main(){
    string a[] = {"cccc","zz","bbb","aa"} ;
    sort(a,a+4,cmp) ;
    for(int i=0;i<4;i++){
        cout << a[i] << endl ;
    }
    return 0 ;
}
输出结果:aa
zz
bbb
cccc

(7) lower_bound()和upper_bound()
lower_bound()和upper_bound()需要用在一个有序数组或者容器中。
Lower_bound(st,ed,val)用来寻找在数组或者容器中的[st,ed)范围内第一个值大于等于val的元素的位置,如果是数组,则返回该位置的指针,如果是容器则返回该位置的迭代器。
Upper_bound(st,ed,val)用来寻找在数组或者容器中的[st,ed)范围内的第一个大于val的元素的位置,如果是数组,则返回该位置的指针,如果是容器,则返回该位置的迭代器。

int a[10] = {1,2,2,3,3,3,5,5,5,5} ;

    //search -1
    int* lp = lower_bound(a,a+10,-1) ;
    int* up = upper_bound(a,a+10,-1) ;
    cout << lp - a << ' ' << up - a << endl ;
    //search 1
    lp = lower_bound(a,a+10,1) ;
    up = upper_bound(a,a+10,1) ;
    cout << lp - a << ' ' << up - a << endl ;
    //search 3
    lp = lower_bound(a,a+10,3) ;
    up = upper_bound(a,a+10,3) ;
    cout << lp - a << ' ' << up - a << endl ;
    //search 4
    lp = lower_bound(a,a+10,4) ;
    up = upper_bound(a,a+10,4) ;
    cout << lp - a << ' ' << up - a << endl ;
    //search 6
    lp = lower_bound(a,a+10,6) ;
    up = upper_bound(a,a+10,6) ;
cout << lp - a << ' ' << up - a << endl ;
输出结果:0 0
0 1
3 6
6 6
10 10
    如果想要获得数组中欲查元素的下标,可以直接令`lower_bound()`和`upper_bound()`的返回值减去数组的首地址即可。如果查找的对象是容器,则返回的是对应的迭代器。

  • 6
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: C++标准模板C++ Standard Template Library,简称STL)是C++标准库的一部分,包含了一系列的通用模板类和函数,用于解决一些常见的数据结构和算法问题。STL提供了一套相对独立和高效的API,使得数据结构和算法的实现变得简单、灵活和有效率。 STL主要包括三个部分:容器(Containers)、算法(Algorithms)和迭代器(Iterators)。容器提供了多种数据结构,包括数组、链表、堆栈、队列、集合和映射等;算法提供了诸如排序、查找、替换等常用操作的函数模板;迭代器则提供了一种可遍历容器中元素的通用接口。 STL的编程实战涉及到使用STL提供的容器、算法和迭代器来进行数据结构和算法的实现和应用。通过STL,我们可以避免手动编写底层数据结构和算法,提高开发效率和代码质量。例如,我们可以通过STL的向量(Vector)容器来存储一组数据,并使用STL提供的排序算法来对其进行排序;我们也可以使用STL的链表(List)容器来实现一个双向链表,并通过STL提供的迭代器遍历其中的元素。 除了常见的数据结构和算法,STL还提供了一些高级特性,如函数对象、适配器和仿函数等,可以帮助我们更加灵活地进行编程。此外,STL还支持自定义类型的容器和算法,我们可以通过重载运算符或提供自定义的比较函数来适应不同的需求。 总之,STL编程实战是指利用C++标准模板提供的容器、算法和迭代器等工具来解决各种数据结构和算法相关的问题。通过充分理解和熟练应用STL,我们可以提高代码的可读性、可维护性和复用性,同时减少开发周期和避免重复造轮子,提升开发效率。 ### 回答2: C++标准模板(STL)是C++编程语言中的一个重要组成部分,它提供了一套丰富的数据结构和算法模板,简化了程序员的开发过程,提高了代码的复用性和开发效率。 在实际编程中,我们可以运用STL来解决各种问题。首先,STL提供了容器(Container)类模板,如vector、list、set和map等,它们分别对应了动态数组、链表、集合和映射等常用数据结构。我们可以根据具体的需求选择合适的容器,通过简单的调用相关成员函数,即可完成数据的插入、删除、查找等操作。例如,可以使用vector容器来实现栈和队列的功能,或者使用set容器来进行数据去重。 其次,STL还提供了算法(Algorithm模板,如排序、查找、集合操作等。这些算法模板已经在STL中进行了高度封装和优化,我们只需通过简单的函数调用,即可实现各种复杂的功能。例如,可以使用sort算法对一个vector进行排序,或者使用find算法在一个list中查找指定元素。 此外,STL还提供了迭代器(Iterator)类模板,它是一种类似指针的对象,用于迭代访问容器中的元素。通过使用迭代器,我们可以方便地对容器中的元素进行遍历和访问。例如,可以使用迭代器遍历一个vector,并对每个元素进行相应的操作。 总的来说,STL的编程实战可以极大地简化我们的编码工作。通过灵活运用STL提供的容器、算法和迭代器,我们可以快速高效地解决各种问题,提高代码的质量和可读性。因此,熟练掌握STL的使用方法,对于C++编程者而言是非常重要的。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

永夜天

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值