错误:二进制表达式的操作数无效(映射使用查找函数错误)


#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是保留标识符,不应在代码中使用。任何以__开头的标识符或以单个_开头后跟大写字母的标识符都保留供编译器/标准库使用。

最新更新