一、定义
不改变元素的顺序,也不改变元素值,可用于所有的容器操作。
二、for_each()算法
原型:for_each(iterator begin,iterator end,proc op)
作用:for_each算法实现对区间[begin,end]中每一个元素均调用进程op
2.1 一般用法
2.2 for_each中使用仿函数
2.3 使用for_each的返回值
三、元素计数算法
原型:count(iterator begin,iterator end,const T& value)
定义:统计在区间[begin,end]中元素的值等于value的元素的个数。
原型:count_if(iterator begin,iterator end,UnaryPredicate op)
定义:统计在区间[begin,end]内使得op为真的元素的个数
举例如下:
四、最小值和最大值算法
4.1 最小值算法
原型:iterator min_element(iterator begin,iterator end)
定义:以operator<进行比较,返回最小值
原型:iterator min_element(iterator begin,iterator end,CompFunc op)
定义:以op(elem1,elem2)为真进行比较,如果第一个元素小于第二个元素,op应该返回true
4.2 最大值算法
原型:iterator max_element(iterator begin,iterator end)
定义:以operator>进行比较,返回最大值
原型:iterator max_element(iterator begin,iterator end,CompFunc op)
定义:以op(elem1,elem2)为假进行比较,如果第一个元素大于第二个元素,应该返回false
举例如下:
5.2 mismatch()
原型:pair<iterator1,iteraor2> mismatch(iterator1 begin1,iterator1 end1,iterator2 begin2)
定义:寻找对象之间两两相异的对应元素,如果没有找到相异点,函数返回值是一个pair,以第一个对象的end元素和第二个对象对应的元素组成
原型:pair<iterator1,iterator2> mismatch(iterator1 begin1,iterator1 end1,iterator2 begin2, Pred pr)
定义:寻找两个对象之间两两可以使pr为真的元素,如果没有找到相异点,函数返回值是一个pair,以第一个对象的end元素和第二个对象对应的元素组成
举例如下:
比较原则:
1、如果两个元素不相等,则两个元素的比较结果即使两个序列的比较结果
2、如果两个容器数量不相等,则元素较少的序列小于另一个序列,即若第一序列元素的数量较少,则比较结果为true
3、如果两个序列没有更多的元素作比较,则两序列相等,比较结果为false
原型:
bool lexicographical_compare(iterator1 begin1,iterator1 end1,iterator2 begin2,iterator2 end2)
bool lexicographical_compare(iterator1 begin1,iterator1 end1,iterator2 begin2,iterator2 end2,Pred pr)
举例如下:
不改变元素的顺序,也不改变元素值,可用于所有的容器操作。
二、for_each()算法
原型:for_each(iterator begin,iterator end,proc op)
作用:for_each算法实现对区间[begin,end]中每一个元素均调用进程op
2.1 一般用法
如下,打印输出容器中的每一个元素:
#include "stdafx.h"
#include "algorithm"
#include "iostream"
#include "vector"
using namespace std;
void print(const int& i)
{
cout<<i<<" ";
}
int _tmain(int argc, _TCHAR* argv[])
{
vector<int> vec;
vec.push_back(1);
vec.push_back(2);
vec.push_back(3);
for_each(vec.begin(),vec.end(),print);
system("pause");
return 0;
}
2.2 for_each中使用仿函数
#include "stdafx.h"
#include "algorithm"
#include "iostream"
#include "vector"
using namespace std;
void print(const int& i)
{
cout<<i<<" ";
}
template<typename T>
class Multiple
{
private:
T theValue;
public:
Multiple(T v):theValue(v)
{
}
void operator()(T& elem)const//重载()操作符,可以像使用函数一样使用该类
{
elem*=theValue;
}
};
int _tmain(int argc, _TCHAR* argv[])
{
vector<int> vec;
vec.push_back(1);
vec.push_back(2);
vec.push_back(3);
for_each(vec.begin(),vec.end(),print);
cout<<endl;
for_each(vec.begin(),vec.end(),Multiple<int>(10));
for_each(vec.begin(),vec.end(),print);
cout<<endl;
system("pause");
return 0;
}
2.3 使用for_each的返回值
#include "stdafx.h"
#include "algorithm"
#include "iostream"
#include "vector"
using namespace std;
void print(const int& i)
{
cout<<i<<" ";
}
template<typename T>
class Multiple
{
private:
T theValue;
public:
Multiple(T v):theValue(v)
{
}
void operator()(T& elem)const
{
elem*=theValue;
}
operator int()
{
return static_cast<int>(theValue);
}
};
int _tmain(int argc, _TCHAR* argv[])
{
vector<int> vec;
vec.push_back(1);
vec.push_back(2);
vec.push_back(3);
for_each(vec.begin(),vec.end(),print);
cout<<endl;
int val=for_each(vec.begin(),vec.end(),Multiple<int>(10));
for_each(vec.begin(),vec.end(),print);
cout<<endl;
cout<<"val="<<val<<endl;
system("pause");
return 0;
}
三、元素计数算法
原型:count(iterator begin,iterator end,const T& value)
定义:统计在区间[begin,end]中元素的值等于value的元素的个数。
原型:count_if(iterator begin,iterator end,UnaryPredicate op)
定义:统计在区间[begin,end]内使得op为真的元素的个数
举例如下:
#include "stdafx.h"
#include "algorithm"
#include "iostream"
#include "vector"
using namespace std;
void print(const int& i)
{
cout<<i<<" ";
}
bool isEven(const int& i)
{
return (i%2==0);
}
int _tmain(int argc, _TCHAR* argv[])
{
vector<int> vec;
vec.push_back(1);
vec.push_back(2);
vec.push_back(3);
vec.push_back(2);
for_each(vec.begin(),vec.end(),print);
cout<<endl;
int ct=count(vec.begin(),vec.end(),2);
cout<<"元a素?值?等?于?的?元a素?的?个?数y是?"<<ct<<endl;
ct=count_if(vec.begin(),vec.end(),isEven);
cout<<"元a素?是?偶?数y的?元a素?的?个?数y是?"<<ct<<endl;
ct=count_if(vec.begin(),vec.end(),bind2nd(greater<int>(),2));
cout<<"值?大?于?的?元a素?的?个?数y是?"<<ct<<endl;
system("pause");
return 0;
}
四、最小值和最大值算法
4.1 最小值算法
原型:iterator min_element(iterator begin,iterator end)
定义:以operator<进行比较,返回最小值
原型:iterator min_element(iterator begin,iterator end,CompFunc op)
定义:以op(elem1,elem2)为真进行比较,如果第一个元素小于第二个元素,op应该返回true
4.2 最大值算法
原型:iterator max_element(iterator begin,iterator end)
定义:以operator>进行比较,返回最大值
原型:iterator max_element(iterator begin,iterator end,CompFunc op)
定义:以op(elem1,elem2)为假进行比较,如果第一个元素大于第二个元素,应该返回false
举例如下:
#include "stdafx.h"
#include "algorithm"
#include "iostream"
#include "vector"
using namespace std;
void print(const int& i)
{
cout<<i<<" ";
}
bool miner(const int& elem1,const int& elem2)
{
return elem1<elem2;
}
int _tmain(int argc, _TCHAR* argv[])
{
vector<int> vec;
vec.push_back(1);
vec.push_back(2);
vec.push_back(3);
vec.push_back(2);
for_each(vec.begin(),vec.end(),print);
cout<<endl;
vector<int>::iterator it=min_element(vec.begin(),vec.end());
cout<<"容Y器?中D的?最?小?元a素?是?"<<*it<<endl;
it=min_element(vec.begin(),vec.end(),miner);
cout<<"容Y器?中D的?最?小?元a素?是?"<<*it<<endl;
it=max_element(vec.begin(),vec.end());
cout<<"容Y器?中D的?最?大?元a素?是?"<<*it<<endl;
it=max_element(vec.begin(),vec.end(),miner);
cout<<"容Y器?中D的?最?大?元a素?是?"<<*it<<endl;
system("pause");
return 0;
}
注意:如果存在多个最小值或者最大值,算法返回第一个找到的最小或者最大值
五、区间比较算法
5.1 equal()
原型:bool equal(iterator1 begin,iterator1 end,itaerator2 begin2)
定义:实现两个容器对象的比较,如果两个容器的元素相等,则返回true
原型:bool equal(iterator1 begin,iterator1 end,iterator2 begin2,Pred op)
定义:实现两个容器对象的比较,如果两个容器的对象使得op为真,则返回true
举例如下:
#include "stdafx.h"
#include "algorithm"
#include "vector"
#include "iostream"
using namespace std;
bool relation(const int& i,const int& j)
{
return i==j;
}
int _tmain(int argc, _TCHAR* argv[])
{
vector<int> vec1;
vec1.push_back(2);
vec1.push_back(3);
vec1.push_back(4);
vector<int> vec2;
vec2.push_back(2);
vec2.push_back(3);
vec2.push_back(4);
if(equal(vec1.begin(),vec1.end(),vec2.begin())==true)
cout<<"两?个?容Y器?相?等?<<endl;
if(equal(vec1.begin(),vec1.end(),vec2.begin(),relation)==true)
cout<<"两?个?容Y器?相?等?<<endl;
system("pause");
return 0;
}
5.2 mismatch()
原型:pair<iterator1,iteraor2> mismatch(iterator1 begin1,iterator1 end1,iterator2 begin2)
定义:寻找对象之间两两相异的对应元素,如果没有找到相异点,函数返回值是一个pair,以第一个对象的end元素和第二个对象对应的元素组成
原型:pair<iterator1,iterator2> mismatch(iterator1 begin1,iterator1 end1,iterator2 begin2, Pred pr)
定义:寻找两个对象之间两两可以使pr为真的元素,如果没有找到相异点,函数返回值是一个pair,以第一个对象的end元素和第二个对象对应的元素组成
举例如下:
#include "stdafx.h"
#include "iostream"
#include "vector"
#include "algorithm"
using namespace std;
bool OperFunc(const int& i,const int& j)
{
if(i>=j)
return false;
return true;
}
int _tmain(int argc, _TCHAR* argv[])
{
vector<int> vec1,vec2;
vec1.push_back(1);
vec1.push_back(2);
vec1.push_back(3);
vec2.push_back(1);
vec2.push_back(3);
vec2.push_back(3);
pair<vector<int>::iterator,vector<int>::iterator> pr=mismatch(vec1.begin(),vec1.end(),vec2.begin());
cout<<"vec1/vec2中第一对不同的元素分别是"<<*(pr.first)<<" "<<*(pr.second)<<endl;
pair<vector<int>::iterator,vector<int>::iterator> pr1=mismatch(vec1.begin(),vec1.end(),vec2.begin(),OperFunc);
cout<<"vec1/vec2中满足使得OperFunc为假的元素分别是"<<*(pr1.first)<<" "<<*(pr1.second)<<endl;
return 0;
}
5.3 字典式比较lexicographical_compare()
比较原则:
1、如果两个元素不相等,则两个元素的比较结果即使两个序列的比较结果
2、如果两个容器数量不相等,则元素较少的序列小于另一个序列,即若第一序列元素的数量较少,则比较结果为true
3、如果两个序列没有更多的元素作比较,则两序列相等,比较结果为false
原型:
bool lexicographical_compare(iterator1 begin1,iterator1 end1,iterator2 begin2,iterator2 end2)
bool lexicographical_compare(iterator1 begin1,iterator1 end1,iterator2 begin2,iterator2 end2,Pred pr)
举例如下:
#include "stdafx.h"
#include "iostream"
#include "vector"
#include "algorithm"
using namespace std;
bool OperFunc(const int& i,const int& j)
{
if(i>=j)
return false;
return true;
}
int _tmain(int argc, _TCHAR* argv[])
{
vector<int> vec1,vec2;
vec1.push_back(1);
vec1.push_back(2);
vec1.push_back(3);
vec2.push_back(1);
vec2.push_back(3);
vec2.push_back(3);
bool pr=lexicographical_compare(vec1.begin(),vec1.end(),vec2.begin(),vec2.end());
if(pr==true)
cout<<"第?一?个?容Y器?较?小?"<<endl;
bool pr1=lexicographical_compare(vec1.begin(),vec1.end(),vec2.begin(),vec2.end(),OperFunc);
if(pr1==true)
cout<<"vec1小?于鷙ec2"<<endl;
return 0;
}