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