c++ find和find_if疑问

请看下面代码:

    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;      //编译报错