请看下面代码:
unordered_map<string, int> tum;
tum["Jorden"] = 99;
tum["Kobe"] = 98;
tum["MgGrade"] = 90;
auto kobe_ele = find_if(tum.begin(), tum.end(), [](const pair<string, int>& man){return (man.first == "Kobe");});
cout << "科比的分数是:" << (*kobe_ele).second << endl;
auto tman_ele = find(tum.begin(), tum.end(), pair<const string, int>("MgGrade", 90));
cout << "麦蒂的分数是:" << (*tman_ele).second << endl;
我的问题是,为什么findif使用的是
const pair<string, int>
而find得使用
pair<const string, int>
?
一、
因为问题起于泛型搜索算法find_if(),所以先总结下有关find()和find_if()。 声明:
InputIterator
find (InputIterator beg, InputIterator end, const T& value)
InputIterator
find_if(InputIterator beg, InputIterator end, UnaryPredicate op)第一种形式返回在搜索域[beg,end)内与value值相等的元素的地址;
第二种形式返回在搜索域[beg,end)内满足一元谓词函数op(elem)为真的元素的地址。
1) 以上两种形式在搜索不到匹配元素的情况下均返回end;
2) 注意op函数调用期间不能够改变自身的状态;
3) op不能更改传递进来的参数;
因为两种函数的定义有差别,所以传入的参数有差别;以上内容摘自编程小翁的博客
链接:http://www.cnblogs.com/wengzilin/archive/2012/10/20/2732252.html
希望有帮助
C++参考标准里有说
附上链接:
http://en.cppreference.com/w/cpp/algorithm/find
这个问题还真有点罗嗦:
在find_id里 [](const pair<string, int>& man){return (man.first == "Kobe");}
是一个匿名函数,等价于提前在外面定义一个具名函数:
bool PREDICT(const pair<string, int>& man) {
return (man.first == "Kobe");
}
在形参里面用**常引用**是一个好习惯,也可以不用常引用: [](pair<string, int> man){return (man.first == "Kobe");}
到了这里,你的真正的问题应该是:
为什么find_if里面用的类型是
pair<string,int>
,而find里面用的类型是pair<const string, int>
?
首先,对于map和unordered_map,由于键是不可变的,所以unordered_map<string, int> tum;
这个map里数据的类型是pair<const string, int>
。 ,http://www.cplusplus.com/reference/map/map/
所以,如果find里面如果不用类型pair<const string, int>
是无法编译的。因为两个不同的类型不能比较。
而find_if里面实际是一个形参,也就意味着一次赋值,在赋值的时候可以把pair<const string, int>
赋值给pair<string, int>
。
用个例子来看一下:
pair<string, int> p1("p1", 100);
pair<const string, int> p2("p2", 90);
p1 == p2; //编译报错
p1 = p2; //不报错
p2 = p1; //编译报错