免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 5472 | 回复: 11

[算法] find_if算法中仿函数的实现 [复制链接]

论坛徽章:
0
发表于 2006-11-22 10:52 |显示全部楼层
有如下数据结构:
map<string, int>map_sou;
要求实现如下算法给定一个字符串判断map_sou的first元素是否包括了该字符串;我想用find_if实现但不知道该仿函数如何实现?
如:
map["abcd"]=1;
map["acde"]=2;
map["bdef"]=3
.
.
.
.
等...........

给定一个字符串string s = "cd"返回如下结果
map["abcd"];
map["acde"];

论坛徽章:
0
发表于 2006-11-22 11:01 |显示全部楼层
好像你的意思和map无关,就是问如何匹配字符串了?

论坛徽章:
0
发表于 2006-11-22 11:13 |显示全部楼层
原帖由 lknh17 于 2006-11-22 11:01 发表
好像你的意思和map无关,就是问如何匹配字符串了?


就是说如何去匹配map中可以中的字符串。不知道能否用find_if解决?

论坛徽章:
0
发表于 2006-11-22 11:17 |显示全部楼层
find 系列算法只适用于顺序容器,关联容器都有自己的 find 算法(成员)。

你的要求用 map 的 find() 即可。

如果学习如何写自己的 functor,随便找本 C++ 的书上都有例子。也可在网上搜索。

论坛徽章:
0
发表于 2006-11-22 11:20 |显示全部楼层
原帖由 whyglinux 于 2006-11-22 11:17 发表
find 系列算法只适用于顺序容器,关联容器都有自己的 find 算法(成员)。

你的要求用 map 的 find() 即可。

如果学习如何写自己的 functor,随便找本 C++ 的书上都有例子。也可在网上搜索。


find是完全匹配key值的,而我目前的要求是匹配key值的一部分内容。

论坛徽章:
0
发表于 2006-11-22 11:43 |显示全部楼层
这个问题有点意思,自己写了一个,应该是可以满足LZ的要求的:


  1. #include <algorithm>
  2. #include <map>
  3. #include <string>

  4. using namespace std;

  5. struct CompMapString
  6. {
  7.         bool operator()(const pair<string, int>& Iter)
  8.         {
  9.                 return Iter.first.find("cd") != string::npos;
  10.         }
  11. };

  12. int main()
  13. {
  14.         map<string, int> map_sou;
  15.         map_sou["abcd"]=1;
  16.         map_sou["acde"]=2;
  17.         map_sou["bdef"]=3;
  18.         map<string, int>::iterator Iter;
  19.         Iter = find_if(map_sou.begin(), map_sou.end(), CompMapString());
  20.         if (Iter != map_sou.end())
  21.                 cout << (*Iter).first << endl;

  22.        return 0;
  23. }
复制代码

论坛徽章:
0
发表于 2006-11-22 11:46 |显示全部楼层
原帖由 whyglinux 于 2006-11-22 11:17 发表
find 系列算法只适用于顺序容器,关联容器都有自己的 find 算法(成员)。



我看了一下find_if的实现,代码如下:

  1. template<class _InIt,
  2.         class _Pr> inline
  3.         _InIt find_if(_InIt _First, _InIt _Last, _Pr _Pred)
  4.         {        // find first satisfying _Pred
  5.         for (; _First != _Last; ++_First)
  6.                 if (_Pred(*_First))
  7.                         break;
  8.         return (_First);
  9.         }
复制代码


也就是说传入的iterator只要重载了++操作符就可以了,不论是什么容器的iterator都已经重载了这个操作符的,所以只需要自己创建一个仿函数对pair<string, int>对象中的first进行查询就可以了.

论坛徽章:
0
发表于 2006-11-22 12:15 |显示全部楼层
converse 说得对,是我想错了。

论坛徽章:
0
发表于 2006-11-22 13:46 |显示全部楼层
不错。可惜map没有自带的find_if   否则自己改装一个map岂不是很爽,呵呵。

论坛徽章:
0
发表于 2006-11-22 13:53 |显示全部楼层
原帖由 okmmno1 于 2006-11-22 13:46 发表
不错。可惜map没有自带的find_if   否则自己改装一个map岂不是很爽,呵呵。


没有这个必要吧,不然STL作者提炼出来的通过迭代器分离容器和算法的思想就白费了,就是为了给程序员偷懒用的.

用yahoo搜索广告<<跪族>>里面的台词说:
人家研究了500年想出办法把糖分从葡萄酒中分离出来,您这一兑不就给兑回去了么?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP