map按value值查找——find_if的使用
2012-05-09 15:29
351 查看
最近是经常使用stl中的map,于是就想记一些关于map的东西。这一篇中会讲到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 <map>
#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不一样,想大家应该是明白的。
大家都知道在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 <map>
#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不一样,想大家应该是明白的。
相关文章推荐
- map按value值查找——find_if的使用
- map按value值查找——find_if的使用
- map按value值查找——find_if的使用(转载)
- g++中使用std map根据value查找find_if
- 使用find_if的自定义条件查找vector或map
- 使用find_if算法搜寻map的value
- STL 结构体排序及查找 使用sort及find_if
- shell脚本中if与case使用,查找文件locate与find的使用,压缩,解压及归档工具
- 对map使用find_if()
- [转载]C++中 使用数组作为map容器VAlue值的解决方法
- Linux命令 find和mv的结合使用:查找文件,移动到某个目录
- 使用find在目录中查找文件的常用用法
- 查找技巧,find及xargs的使用
- STL的find_if的使用
- C++ STL算法系列2---find ,find_first_of , find_if , adjacent_find的使用
- map的查找,用find, 别用中括号
- 使用mybatis_generatoer工具后出现Result Maps collection already contains value for BaseResultMap
- 在linux下使用find命令查找某一个时间点以后创建或者修改的文件
- ExpandableListActivity使用findViewById查找child中view的时序问题
- 使用map出去if else