#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_)
~~~~~~~~ ^ ~~~~~~~~
我不知道我在这段代码中做错了什么。 希望你能给我一个建议。
要使代码正常工作,您需要稍微修改运算符定义:
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");
请注意,如果未找到元素,则不检查it != me1->end()
cout << it->first << endl
将导致未定义的行为。
请注意,__ME
是保留标识符,不应在代码中使用。任何以__
开头的标识符或以单个_
开头后跟大写字母的标识符都保留供编译器/标准库使用。