在STL地图中搜索

时间:2018-12-03 10:01:29

标签: c++ stl

我有一个以结构体的指针为键的映射。

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;
}

3 个答案:

答案 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;});