stl算法和防函数
防函数就是在类中包含一个operator()函数,之后这个类就有了类似函数的行为,方便了变量的管理
一、for_each 算法
#include<iostream>
#include<vector>
#include<algorithm>
#include<functional>
using namespace std;
void print(int &t)
{
cout << t << " ";
}
template <class T>//没有返回值得仿函数
class Multiple
{
private:
T thevalue;
public:
Multiple(const T &v) :thevalue(v)
{
}
void operator()(T &elem)const
{
elem *= thevalue;
}
};
class SUM//有返回值的仿函数
{
private:
long sum_D;
public:
SUM() :sum_D(0)
{
}
void operator()(int elem)
{
sum_D += elem;
}
operator double()
{
return static_cast<double>(sum_D);
}
};
int main()
{
vector<int> vec;
vec.push_back(1);
vec.push_back(2);
vec.push_back(3);
vec.push_back(4);
vec.push_back(5);
vec.push_back(6);
for_each(vec.begin(), vec.end(), print);
cout << endl;
for_each(vec.begin(), vec.end(), Multiple<int>(2));
for_each(vec.begin(), vec.end(), print);
cout << endl;
double sum = for_each(vec.begin(), vec.end(), SUM());//有返回值的仿函数
cout << sum;
cin.get();
return 0;
}
二、count,count_if
bool iseven(int elem)
{
return elem % 2 == 0;
}
int cnt = count(vec.begin(), vec.end(), 4);
int cntif = count_if(vec.begin(), vec.end(), iseven);//统计偶数
int ctg = count_if(vec.begin(), vec.end(), bind2nd(greater<int>(), 2));//统计大于2的个数
三、最大,最小
bool AbsLess(int elem1, int elem2)
{
return abs(elem1) < abs(elem2);
}
cout << *min_element(vec.begin(), vec.end()) << endl;//返回迭代器
cout << *max_element(vec.begin(), vec.end()) << endl;
cout << *min_element(vec.begin(), vec.end(),AbsLess) << endl;//AbsLess绝对值比较
cout << *max_element(vec.begin(), vec.end(),AbsLess) << endl;
四、查找
iterator pos=find(vec.begin(),vec.end(),5);返回的是第一个为5的位置
位置为pos-vec.begin()+1
iterator pos2=find_if(vec.begin(),vec.end(),bind2nd(greater<int>(),3));
第一个大于3的位置:pos2-vec.begin()+1;
search_n(vec.begin(), vec.end(), 4, 3);查找4个连续的3,如果为end则没找到
search_n(vec.begin(), vec.end(), 4, 4,greater<int>());查找4个连续大于4的
search(vec.begin(),vec.end(),subvec.begin(),subvec.end());查找子区间
find_end(vec.begin(),vec.end(),subvec.begin(),subvec.end());查找最后一个子区间
find_first_of(vec.begin(),vec.end(),subvec.begin(),subvec.end());查找第一个子区间
adjacement_find(vec.begin(),vec.end());查找第一对连续元素
五.比较
1.equal
bool eq=equal(v1.begin(),v1.end(),v2.begin());//逐个比较元素
if(eq)
{
cout<<"v1==v2"<<endl;
}
else
{
cout<<"v1!=v2"<<endl;
}
bool relationship(int e1,int e2)
{
int tmp=e1+2;
return tmp==e2;
}
bool eq2=equal(v1.begin(),v1.end(),v2.begin(),relationship); //比较v1和v2元素之间是不是满足一定的关系
if(eq2) { cout<<"v2[i]=v1[i]=2"<<endl;
} else { cout<<"v2[i]!=v1[i]=2"<<endl; }
2.mismatch
list<int>l1;
vector<int>l2;
pair<list<int>::iterator,vector<int>::iterator> p1;
p1=mismatch(l1.begin(),l1.end(),l2.begin());p1.first是l1中不匹配的第一个元素,p2.second是l2中不匹配的第一个元素
p1=mismatch(l1.begin(),l1.end(),l2.begin(),less_equal<int>());满足l1中的元素小于等于l2中元素;p1.first是l1中不匹配的第一个元素,p2.second是l2中不匹配的第一个元素
3.lexicographical_compare()字典式比较
1)两元素不等,元素比较结果就是最终比较结果
2)两个结构元素数量不等,数量少的小,
3)两个结构元素都相等
lexicographical_compare(l1.bein(),l1.end(),l2.begin(),l2.end());l1<l2返回true,否则返回false

浙公网安备 33010602011771号