我有一个以结构体的指针为键的映射。
std :: map
struct struct1 {int x;字符a [10]; }; struct struct2 {int x; };
键是指向struct1的指针。 struct1的成员名为x。
我必须按struct1的成员x搜索地图。
是否可以在不循环浏览地图中所有元素的情况下进行搜索?
我尝试了下面的代码,但是没有用。
include <iostream>
#include <map>
struct struct1 { int x; char a[10]; };
struct struct2{ int x; };
bool operator<(const struct1 & fk1, const struct1& fk2) {
return fk1.x < fk2.x;
}
int main()
{
std::map<struct1 *, struct2> 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;
std::map<struct1 *, struct2>::iterator x = m.find(&fk1);
if(x != m.end())
{
std::cout << x->first->x <<std::endl;
std::cout << x->first->a <<std::endl;
}
if(f1!=NULL)
delete f1;
return 0;
}
答案 0 :(得分:0)
使用自定义比较器将指向的值传递给您已经存在的operator<
。像这样
struct Cmp
{
// use pointed to value for comparison
bool operator()(const struct1* x, const struct1* y) const { return *x < *y; }
};
std::map<struct1 *, struct2, Cmp> m;
答案 1 :(得分:0)
让我们扩展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;
}
答案 2 :(得分:0)
您可以使用std :: find_if函数,例如:
int search_value = 222;
auto it = std::find_if(m.begin(), m.end(), [search_value](const pair<struct1*, struct2> &s){ return s.first->x == search_value;});