Давайте расширим параметры по умолчанию m
:
std::map<struct1 *, struct2, std::less<struct1 *>, std::allocator<std::pair<const struct1 *, struct2> >
Мы увидим, что компаратором карты является std::less<struct1 *>
, который будет проверять числовое значение аргументов указателя.Он не вызывает struct1::operator <
.
Если у вас есть компилятор C ++ 14, и вы хотите искать его с помощью члена int, вы должны использовать пользовательский компаратор, который прозрачный , например
struct struct1_less
{
typedef void is_transparent;
// C++11 and later: using is_transparent = void;
// compare pointers
bool operator()(const struct1* lhs, const struct1* rhs) const { return lhs->x < rhs->x; }
// compare with int
bool operator()(const struct1* lhs, int rhs) const { return lhs->x < rhs; }
bool operator()(int lhs, const struct1* rhs) const { return lhs < rhs->x; }
};
Используется как
typedef std::map<struct1 *, struct2, struct1_less> struct1_lookup;
int main()
{
struct1_lookup m;
struct1 *f1 = new struct1();
f1->x =1;
strcpy(f1->a,"ab");
struct2 l1;
l1.x=10;
m.insert(std::make_pair(f1, l1));
struct1 fk1;
fk1.x=1;
struct1_lookup::iterator x = m.find(&fk1);
if(x != m.end())
{
std::cout << x->first->x <<std::endl;
std::cout << x->first->a <<std::endl;
}
delete f1;
return 0;
}