stl中的谓词函数

likeacmlian 2009-05-07 04:43:37
各位大侠,最近在学习STL,使用LIST::REMOVE_IF函数时遇到了一些问题,代码如下:
#include<iostream>
#include<list>

using namespace std;

bool Compare( int i )
{
return ( i >= 3 && i <= 8 );
}

void Print( list<int> &ivec )
{
list<int>::const_iterator it = ivec.begin(), it_end = ivec.end();

for( ; it != it_end; ++ it )
cout << *it << ' ';

cout << endl;
}

int main()
{
int ia[] = { 1, 3, 9, 4, 5, 34, 2 };
list<int> ivec( ia, ia + 7 );

Print( ivec );

ivec.remove_if(Compare); //去掉3和8之间的元素

Print( ivec );

system("Pause");

return 0;
}

1、关于List的remove_if函数的参数不明白?参考手册上的解释如下:
void remove_if( UnPred pr );
remove_if()以一元谓词pr为判断元素的依据,遍历整个链表。如果pr返回true则删除该元素。
那么谓词是什么东东?应该怎么定义?怎么使用?我查了一些资料,说法为:“做某些检测的函数,配合标准算法库使用”,不过对于其定义和使用没有一个规范的说法?我还是没有明白?


2、上述的代码我在VC6.0+sp6中无法编译通过,错误提示:
error C2664: 'remove_if' : cannot convert parameter 1 from 'bool (const double &)' to 'class std::binder2nd<struct std::not_equal_to<double> >'
这里的class std::binder2nd<struct std::not_equal_to<double> >是个什么类型啊?能不能详细说明一下!
我在其它的一些资料中查到:“谓词即为元素存储和检索的描述,如std::less<>,std::greater<>那么就按降序/升序排列,你也可以定义自己的谓词”,同时std::binder2nd我发现是捆绑器的意思,不过这个东东和谓词的关系是什么,怎么使用?

我想好好学学这些东东,请各位提供一些好的书籍或是资料,非常感谢!

3、上述的代码我在VS2005中运行无误,这是怎么回事儿啊?难道是VC6.0对于STL的支持有问题?请说说原因,或是改正方法。

分数不多了,请见谅,非常感谢!
...全文
471 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
mengde007 2009-05-08
  • 打赏
  • 举报
回复
侯捷的STL源码剖析;楼主到下载区找找;
likeacmlian 2009-05-08
  • 打赏
  • 举报
回复
非常感谢各位的帮助!请各位提供一些好的书籍或是资料,最好是比较系统同时提供示例的,谢谢!
lzh9955 2009-05-07
  • 打赏
  • 举报
回复
看看他的技术文档吧
fairchild811 2009-05-07
  • 打赏
  • 举报
回复
就是判断吧

感觉VC6其实挺好用的,就是有点老了,很多支持的不好
fallening 2009-05-07
  • 打赏
  • 举报
回复
奉劝楼主,珍爱生命,远离vc6
bushizhuge 2009-05-07
  • 打赏
  • 举报
回复
1.什么谓词的,其实就是一个判断式,说白了就是一个返回bool值的函数或者仿函数。几元就是函数有几个参数,至于定义和使用,函数定义和一般的函数定义一样,仿函数就是写个类,然后重载operator()。使用就是在那些以这种需要返回bool值的函数作参数的函数里用了。
2.bind2nd就是所谓的寒暑配接器了(function adapter),它能够将仿函数和另外的仿函数或者一般的函数或者一个值结合起来,像你的那个remove_if,它只需要一个一元判断式,默认的参数就是你的list<>里面的元素,但是有时候需要一个额外数值来进行判断,比如说,我希望移除list<double>里所有等于3.3的元素,显然这个3.3就是需要额外传进来的,那这时候怎么办?bind2nd就派上用场了,bind2nd(struct std::not_equal_to <double>,3.3),它把需要两个参数的仿函数not_equal_to<>和3.3组合在了一起,返回了一个只要一个参数的仿函数,满足了需求。
3.vc6出来的时候c++尚未标准化,对STL支持差一些很正常,如果要用STL,那就选高点的版本,比如你说的VS2005.
  • 打赏
  • 举报
回复
1、关于List的remove_if函数的参数不明白?参考手册上的解释如下:
void remove_if( UnPred pr );
remove_if()以一元谓词pr为判断元素的依据,遍历整个链表。如果pr返回true则删除该元素。
那么谓词是什么东东?应该怎么定义?怎么使用?我查了一些资料,说法为:“做某些检测的函数,配合标准算法库使用”,不过对于其定义和使用没有一个规范的说法?我还是没有明白?


2、上述的代码我在VC6.0+sp6中无法编译通过,错误提示:
error C2664: 'remove_if' : cannot convert parameter 1 from 'bool (const double &)' to 'class std::binder2nd <struct std::not_equal_to <double> >'
这里的class std::binder2nd <struct std::not_equal_to <double> >是个什么类型啊?能不能详细说明一下!
我在其它的一些资料中查到:“谓词即为元素存储和检索的描述,如std::less <>,std::greater <>那么就按降序/升序排列,你也可以定义自己的谓词”,同时std::binder2nd我发现是捆绑器的意思,不过这个东东和谓词的关系是什么,怎么使用?

我想好好学学这些东东,请各位提供一些好的书籍或是资料,非常感谢!

3、上述的代码我在VS2005中运行无误,这是怎么回事儿啊?难道是VC6.0对于STL的支持有问题?请说说原因,或是改正方法。


1.可以认为UnPred pr就是remove_if执行的时候遵守的某些规则。Compare定义的格式不是写的很清楚么。

2.VC6对STL支持是不好,老东西了。
lingyin55 2009-05-07
  • 打赏
  • 举报
回复
1、参考例子

http://hi.baidu.com/guoliqiang2006/blog/item/5dd893cde648cb1801e928c4.html

2、《STL 源码剖析》

3、vc6中的stl版本比现在的低两个版本,对stl支持不大好。
yshuise 2009-05-07
  • 打赏
  • 举报
回复
哈哈,出现第二问题,就能推出第一个问题的解决。出现第三个问题就能推出第二问题的解决。
所以只需要回答第三个问题:vc6是不支持。
baiwei156 2009-05-07
  • 打赏
  • 举报
回复
1.
在数理逻辑中,一元谓词演算是所有谓词字母都是一元(就是只接受一个参数)并且没有函数字母的谓词演算。
如 P(x),这里的 P 是谓词字母,用来表示某个功能或者动作,而 x 是该谓词的执行者。

2和3.vc6.0对stl支持的不是很好,不建议使用



mengde007 2009-05-07
  • 打赏
  • 举报
回复
VC对于STL的支持本来就有问题;这点很多人都知道;

65,210

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧