[STL] map按value值查找——find_if的使用

11 篇文章 0 订阅

[STL] map按value值查找——find_if的使用

大家都知道在map中,排序是按照key值排的,map自带的find方法也是按着key值查找的,这在某些情况下可能会遇到一些麻烦。

譬如,map<int, char*> m_str中,传入一个char*需要查找在m_str中是否存在这个字符串,当然你大可以使用iterator遍历一些map,

如果你坚持这么做,那就可以直接关闭网页了。

1.先来看看find_if的原型:

template < class InputIterator,  class Predicate> 
InputIterator find_if(InputIterator first, InputIterator last,Predicate pred) 
{ 
        while (first != last && !pred(*first)) ++first; 
        return first; 
} 

find_if是一个模板函数,接受两个数据类型:InputItearator迭代器,Predicate用于比较数值的函数或者函数对象(仿函数)。find_if对迭代器要求很低,只需要它支持自增操作即可。当前遍历到的记录符合条件与否,判断标准就是使得pred()为真。至此可能还有些不是很明了,下面举几个例子实际操练下的它的用法。注意观察第三个参数pred。

2.find_if在std::map查找时的应用

假如我们有个map对象是这么声明的:

std::map< int, std:: string> mymap;
mymap.insert(std::make_pair( 20,  " USA "));
mymap.insert(std::make_pair( 10,  " CHINA ")); 
mymap.insert(std::make_pair( 30,  " English "));
mymap.insert(std::make_pair( 40,  " Hongkong "));

插入值后我们想得到值为”english”的这条记录,要怎样写程序呢?下面是个范例参考下:
#include

#include < string>
#include <algorithm>
class map_value_finder
{
public:
       map_value_finder( const std:: string &cmp_string):m_s_cmp_string(cmp_string){}
        bool  operator ()( const std::map< int, std:: string>::value_type &pair)
       {
             return pair.second == m_s_cmp_string;
       }
private:
         const std:: string &m_s_cmp_string;                    
};
 
int main()
{
    std::map< int, std:: string> my_map;
    my_map.insert(std::make_pair( 10,  " china "));
    my_map.insert(std::make_pair( 20,  " usa "));
    my_map.insert(std::make_pair( 30,  " english "));
    my_map.insert(std::make_pair( 40,  " hongkong "));    
    
    std::map< int, std:: string>::iterator it = my_map.end();
    it = std::find_if(my_map.begin(), my_map.end(), map_value_finder( " English "));
     if (it == my_map.end())
       printf( " not found\n ");       
     else
       printf( " found key:%d value:%s\n ", it->first, it->second.c_str());
       
     return  0;        
}

class map_finder即用于比较的函数对象,它的核心就是重载的()运算符。因为每个容器迭代器的*运算符得到的结果都是该容器的value_type值,所以该运算符的形参就是map迭代器指向的value_type类型的引用。而map的value_type到底是什么类型,就得看下STL的源代码是如何定义的。

template < class Key,  class T,  class Compare = less<Key>,  class Alloc = alloc>
class map
{
public:
typedef Key key_type;
typedef pair< const Key, T> value_type;
......
};

从上面的定义可以看出,map的value_type是std::pair<const Key, t>类型,它的first值就是关键字,second值保存map的值域。
3.find_if在vector中的应用与上面的类似,就不举例子了。 区别就是vecotor的value_type和map的value_type不一样,想大家应该是明白的。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以学生为例,可以用map来存储学生的姓名和对应的学号: ```c++ #include <iostream> #include <map> #include <string> using namespace std; int main() { map<string, int> stu_map; // 添加学生信息 stu_map["张三"] = 1001; stu_map["李四"] = 1002; stu_map["王五"] = 1003; stu_map["赵六"] = 1004; // 查找学生信息 string name; cout << "请输入要查找的学生姓名:"; cin >> name; auto it = stu_map.find(name); if (it != stu_map.end()) { cout << "学号为" << it->second << endl; } else { cout << "未找到该学生信息" << endl; } return 0; } ``` 上述代码中,map的key为string类型,value为int类型,可以根据学生姓名快速查找其对应的学号。 另外,也可以使用STL算法中的find_if来实现查找功能,需要先定义一个查找条件的函数对象: ```c++ #include <iostream> #include <algorithm> #include <vector> #include <string> using namespace std; struct Student { string name; int id; }; bool find_student(const Student& s, const string& name) { return s.name == name; } int main() { vector<Student> stu_vec = { {"张三", 1001}, {"李四", 1002}, {"王五", 1003}, {"赵六", 1004} }; // 查找学生信息 string name; cout << "请输入要查找的学生姓名:"; cin >> name; auto it = find_if(stu_vec.begin(), stu_vec.end(), bind(find_student, placeholders::_1, name)); if (it != stu_vec.end()) { cout << "学号为" << it->id << endl; } else { cout << "未找到该学生信息" << endl; } return 0; } ``` 上述代码中,先定义了一个表示学生的结构体Student,然后使用vector来存储学生信息。使用find_if算法时,需要给出一个查找条件的函数对象,这里使用bind函数将查找条件函数和查找的姓名绑定在一起,placeholders::_1表示函数的第一个参数,即要查找的学生对象。如果找到了符合条件的学生,则输出其对应的学号。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值