#include <iostream>
#include <map>
#include <utility>
using namespace std;
class __ME
{
public:
int age;
__ME()
{
}
__ME(int a)
{
age = a;
}
void Run()
{
if (age)
{
cout << "age" << age << endl;
}
else
{
cout << "run..." << endl;
}
}
};
template <class K, class V>
class value_equals
{
private:
K key;
public:
value_equals(const K &vt) : key(vt)
{
}
bool operator==(pair<const K, V> &elem)
{
return elem->first == key;
}
};
int main()
{
map<string, __ME *> *me1 = new map<string, __ME *>();
me1->insert(map<string, __ME *>::value_type("lyl", new __ME()));
me1->insert(map<string, __ME *>::value_type("lx1", new __ME()));
map<string, __ME *>::iterator it = find(me1->begin(), me1->end(), value_equals<string, __ME *>("lyl"));
cout << it->first << endl;
}
error: invalid operands to binary expression
('std::__1::__map_iterator<std::__1::__tree_iterator<std::__1::__value_type<std::__1::basic_string<char>, __ME *>, std::__1::__tree_node<std::__1::__value_type<std::__1::basic_string<char>, __ME *>, void *> *,
long> >::value_type' (aka 'pair<const std::__1::basic_string<char>, __ME *>') and 'const value_equals<std::__1::basic_string<char>, __ME *>')
if (*__first == __value_)
~~~~~~~~ ^ ~~~~~~~~
我不知道我在这段代码中做错了什么。 我希望你能给我一个建议。
答案 0 :(得分:0)
要使代码正常工作,您需要稍微修改操作符定义:
template <class K, class V>
class value_equals
{
private:
K key;
public:
value_equals(const K &vt) : key(vt)
{
}
bool operator==(const pair<const K, V> &elem) const
{
return elem.first == key;
}
};
template <class K, class V>
bool operator==(const pair<const K, V> &lhs, const value_equals<K,V>& rhs)
{
return rhs == lhs;
}
std::find
试图做element == value
,而您的实现只提供了value == element
。您还需要确保将const
放在所有正确的位置。
如果您使用std::find_if
,这将变得更加简单:
template <class K, class V>
class value_equals
{
private:
K key;
public:
value_equals(const K &vt) : key(vt)
{
}
bool operator()(const pair<const K, V> &elem) const
{
return elem.first == key;
}
};
map<string, __ME *>::iterator it = find_if(me1->begin(), me1->end(), value_equals<string, __ME *>("lyl"));
最简单(也是最有效)的方法是使用std::map
的内置查找支持:
map<string, __ME *>::iterator it = me1->find("lyl");
请注意,如果未找到元素,则cout << it->first << endl
如果不检查it != me1->end()
,将导致未定义的行为。
请注意,__ME
是保留的标识符,不应在您的代码中使用。保留给编译器/标准库使用的任何以__
开头的标识符或以单个_
开头且后跟大写字母的标识符。