程序设计与算法(三)第九周 标准模板库STL(二)(2)

STL算法(一)

STL算法分类

  • 不变序列算法
  • 变值算法
  • 删除算法
  • 变序算法
  • 排序算法
  • 有序区间算法
  • 数值算法

大多数重载的算法都是有两个版本的

  • 用“==”判断元素是否相等,或用“<”来比较大小
  • 多出一个类型参数“Pred"和形参“Pred op":通过表达式“op(x, y)”的返回值:true/false判断x是否“等于”y,或者x是否“小于”y
  • 如有以下两个版本min_element:iterator min_element(iterator first, iterator last)
  • iterator min_element(iterator first, iterator last, Pred op)

不变序列算法

  • 该算法不会修改算法所作用的容器或对象
  • 适用于顺序容器和关联容器
  • 时间复杂度都是O(n)
    这里写图片描述
    这里写图片描述
    这里写图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

一个例子:
#include <iostream>
#include <algorithm>
using namespace std;
class A{
public:
    int n;
    A(int i):n(i){}
};
bool operator<(const A& a1, const A& a2){
    cout<<"< called"<<endl;
    if(a1.n==3&&a2.n==7){return true;}
    return false;
}
int main()
{
    A aa[]={3,5,7,2,1};
    cout<<min_element(aa,aa+5)->n<<endl;
    cout<<max_element(aa, aa+5)->n<<endl;
    return 0;
}
< called
< called
< called
< called
3
< called
< called
< called
< called
7
上面讲了min_element的过程,就是,把第一个元素3拿出来作为最小值,然后和第二个元素5比较,如果5<3则最小值变为5,由于重载了"<"那么只有当传入的数字是3和7的时候,才为true,显然,没有这个组合,因此,最小值为3。
下面是自己的例子,大概看了下,min_element和max_element都调用了<(p1, p2) 这个函数,不同的是,最小值是把result传在了第二个参数,如果第一个参数p1<p2返回true,那么p2 = p1;最大值是把result传在了第一个参数,如果p1<p2返回true,那么p1 = p2;
#include <iostream>
#include <algorithm>
using namespace std;
class A{
public:
    int n;
    A(int i):n(i){}
};
bool operator<(const A& a1, const A& a2){
    cout<<"a1 "<<a1.n<<" a2 "<<a2.n<<endl;
    return a1.n<a2.n;
}
int main()
{
    A aa[]={7,3,5,7,6};
    cout<<min_element(aa, aa+5)->n<<endl;
    cout<<max_element(aa, aa+5)->n<<endl;
    return 0;
}
a1 3 a2 7
a1 5 a2 3
a1 7 a2 3
a1 6 a2 3
3
a1 7 a2 3
a1 7 a2 5
a1 7 a2 7
a1 7 a2 6
7

变值算法

此类算法会修改源区间或目标区间元素的值
值被修改的那个区间,不可以是属于关联容器的

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

这个是个例子
#include <vector>
#include <iostream>
#include <algorithm>
#include <iterator>
using namespace std;
class CLessThen9{
public:
    bool operator()(int n){return n<9;}
};
void outputSquare(int value){cout<<value*value<<" ";}
int calculateCube(int value){return value*value*value;}
int main()
{
    const int SIZE=10;
    int a1[]={1,2,3,4,5,6,7,8,9,10};
    int a2[]={100,2,8,1,50,3,8,9,10,2};
    vector<int> v(a1, a1+SIZE);
    ostream_iterator<int> output(cout, " ");
    random_shuffle(v.begin(), v.end());
    cout<<endl<<"1)";
    copy(v.begin(), v.end(), output);
    copy(a2, a2+SIZE, v.begin());
    cout<<endl<<"2)";
    cout<<count(v.begin(), v.end(), 8);
    cout<<endl<<"3)";
    //clessthen9是一个函数对象,然后count_if调用的是clessthen9.operator(int n)?=true
    cout<<count_if(v.begin(), v.end(), CLessThen9());
    cout<<endl<<"4)";
    cout<<*(min_element(v.begin(), v.end()));
    cout<<endl<<"5)";
    cout<<*(max_element(v.begin(), v.end()));
    cout<<endl<<"6)";
    cout<<accumulate(v.begin(), v.end(), 0);
    cout<<endl<<"7)";
    for_each(v.begin(), v.end(), outputSquare);
    vector<int> cubes(SIZE);
    transform(a1, a1+SIZE, cubes.begin(), calculateCube);
    cout<<endl<<"8)";
    copy(cubes.begin(), cubes.end(), output);
    return 0;
}
1)5 4 8 9 1 6 3 2 7 10 
2)2
3)6
4)1
5)100
6)193
7)10000 4 64 1 2500 9 64 81 100 4 
8)1 8 27 64 125 216 343 512 729 1000 

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值