算法概述
算法主要是由头文件< algorithm > < functional > < numeric >组成。
< algorithm >是所有STL头文件中最大的一个,其中常用的功能涉及到比较,交换,查找,遍历,复制,修改,反转,排序,合并等…
< numeric >体积很小,只包括在几个序列容器上进行的简单运算的模板函数.
< functional > 定义了一些模板类,用以声明函数对象。
STL算法分为:质变算法和非质变算法。
所有的STL算法都作用在由迭代器[first,end)所标示出来的区间上,
质变算法,是指运算过程中会改变区间内的(迭代器所指)的元素内容。比如,拷贝(copy)、互换(swap)、替换(replace)、填写(fill)、删除(remove)、排序(sort)等算法都属于此类。
非质变算法是指是指在运算过程中不会区间内(迭代器所指)的元素内容,比如查找(find)、计数(count)、遍历(for_each)、寻找极值(max,min)等,都属于此类。但是如果你在for_each遍历每个元素的时候试图应用一个会改变元素内容的仿函数,那么元素当然也会改变。
常用遍历算法
for_each练习代码:
基本正向遍历和逆向遍历
for_each绑定参数输出
for_each修改容器元素
for_each返回值
//for_each正向遍历 反向遍历
struct print01{
void operator()(int v){
cout << v << " ";
}
};
void test01(){
vector<int> v;
for (int i = 0; i < 10;i++){
v.push_back(rand() % 100);
}
//正向遍历
for_each(v.begin(), v.end(), print01());
cout << endl;
//反向遍历
for_each(v.rbegin(), v.rend(), print01());
cout << endl;
}
//for_each算法 绑定参数
//将容器中的元素加上100 再输出
struct print2 : public binary_function<int,int,void>{
void operator()(int v1,int v2) const{
cout << v1+v2 << " ";
}
};
void print21(int v1, int v2){
cout << v1 + v2 << " ";
}
void test02(){
vector<int> v;
for (int i = 0; i < 10; i++){
v.push_back(rand() % 100);
}
for_each(v.begin(), v.end(), print01