Chinaunix首页 | 论坛 | 博客
  • 博客访问: 60424
  • 博文数量: 34
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 267
  • 用 户 组: 普通用户
  • 注册时间: 2013-05-29 13:17
文章分类

全部博文(34)

文章存档

2014年(1)

2013年(33)

我的朋友

分类: C/C++

2013-09-05 10:48:20

今天在c++ primary 中看到谓词的用法

个人理解就是函数规则的重新定义,下面的例子演示:

复制代码

		

#include "stdio.h"
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;

 bool isFunc(const string s1,const string s2)
{ return s1.length()<s2.length();
} void func_predicate()
{
    vector<string> vec;
    vec.push_back("d");
    vec.push_back("adc");
    vec.push_back("aa");

    sort(vec.begin(),vec.end()); int i=0; for(i = 0;i)
    {
        cout<endl;
    }

    sort(vec.begin(),vec.end(),isFunc); for(i = 0;i)
    {
        cout<endl;
    }
} int main()
{
    func_predicate(); return 1;
}
复制代码

对于谓词的形参没有特别明确的说法,但是要与对应容器的类型相同,关于是否使用引用形式,好像对结果没有影响;谓词的返回值为bool类型,以返回值的结果作为函数的操作条件。

上面例子输出结果如下:

aa
adc
d
d
aa
adc

没有使用谓词:正常排序,字符窜比对;使用谓词函数按照字符串长度进行排序。

//---------------------------函数对象及谓词的事例-------------------

  1. #include <iostream>
  2. #include <string>
  3. #include <algorithm>
  4. #include <vector>
  5. using namespace std;

  6. class GT_cls
  7. {
  8.     public:
  9.         GT_cls(int ival=0):val(ival){}
  10.         bool operator()(const int& iv)
  11.         {
  12.             return (iv==val);
  13.         }
  14.     private:
  15.         int val;
  16. };
  17. int main()
  18. {
  19.     cout<<"input some nums(ctrl+z to end):"<<endl;
  20.     vector<int>ivec;
  21.     int iv;
  22.     while(cin>>iv)
  23.     {
  24.         ivec.push_back(iv);
  25.     }
  26.     
  27.     cin.clear();
  28.     cout<<"input a num which will be replased:";
  29.     int re;
  30.     cin>>re;

  31.     cout<<"input a given num to insert:";
  32.     int gn;
  33.     cin>>gn;

  34.     GT_cls obj;
  35.     //replace_if(ivec.begin(),ivec.end(),obj(re), gn);//obj(re)返回的是一个bool的结果不是谓词predicate类型
  36.     replace_if(ivec.begin(),ivec.end(),GT_cls(re), gn);
  37.     for (vector<int>::iterator it=ivec.begin(); it!=ivec.end(); it++)
  38.     {
  39.         cout<<*it<<endl;
  40.     }
  41.     return 0;
  42. }


  1. //查找指定长度的字符串个数
  2. #include <iostream>
  3. #include <string>
  4. #include <vector>
  5. #include <algorithm>
  6. using namespace std;

  7. class BT_cls
  8. {
  9.     public:
  10.         BT_cls(size_t len1=0, size_t len2=0):minlen(len1),maxlen(len2){}
  11.         bool operator()(const string &s)
  12.         {
  13.             return (s.size()>=minlen && s.size()<=maxlen);
  14.         }

  15.     private:
  16.         string::size_type minlen, maxlen;
  17. };
  18. int main()
  19. {
  20.     string aStr[]={"aa","aaa","aaaa","aaaaa","aaaaaa"};
  21.     vector<string>text(aStr,aStr+5);
  22.     
  23.     size_t count=count_if(text.begin(),text.end(),BT_cls(2,3));
  24.     cout<<count<<endl;
  25.     return 0;
  26. }


阅读(862) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~