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

 

posted @ 2016-07-02 11:59  ranran1203  阅读(482)  评论(0)    收藏  举报