2011-04-19 78 views
2
key_struct kStruct; 
kStruct.x = 2; 
std::find_if(m_cueCommands.begin(), m_cueCommands.end(), find_MyInt(kStruct)); 

struct key_struct 
{ 
    int x; 
    string y; 
    string z; 
} 

struct find_myInt : std::unary_function<key_struct, bool> 
{  
    int x;  
    find_myInt(key_struct kStruct):myInt(kStruct.x){}  
    bool operator()(key_struct const& m) const 
    {   
    return m.x == myInt;  
    } 
}; 

我很确定我有这个有点搞砸了,但是,我认为它是适度接近。我想要做的是将key_struct作为我地图中的关键字。我希望能够搜索密钥并返回设置key_struct的信息。如果我将key_struct设置为x = 2,那么我只想返回int x等于2的地方。如果我设置x = 2和y =“testString”的位置,那么我只想返回其中x = 2和y =“testString”。C++ STD :: find_if使用结构谓词

我相信我的方法很接近,但我认为我错过了一些东西。想法?

回答

2

你总是想与X比较?或者只有当x!= 0?

顺便说一句,您的结构构造函数似乎有错误:没有名为myInt的成员,因此它应该是:find_myInt(key_struct kStruct) : x(kStruct.x){}。但这并不重要,无论如何都需要改变。

这是我会尝试。这是未经测试的,可能包含错误,布尔返回值的“计算”效率极低。无论如何...

要使用它,创建一个你想要匹配的结构,从代码中可以看到,它只会尝试匹配如果x > 0, y != "" and z != ""。因此,如果将“搜索”结构设置为x = 5, y = "" and z = "",则它将匹配x == 5(可以是任何)的每个密钥。

typedef std::pair<key_struct, your_value_type> yourMapType; 

struct find_myStruct : std::unary_function<key_struct, bool> 
{ 
    private: 
    key_struct myStruct; 

    public: 
    find_myInt(key_struct const & kStruct): myStruct(kStruct) {} 

    bool operator() (yourMapType const & m) const 
    { 
     bool result = true; 

     if (myStruct.x > 0) 
     result &= (myStruct.x == m.first.x); 

     if (myStruct.y != "") 
     result &= (myStruct.y == m.first.y); 

     if (myStruct.z != "") 
     result &= (myStruct.z == m.first.z); 

     return result; 
    } 
}; 

[编辑]注意到你想使用的地图,所以我相应地更新代码。仍然非常未经测试,随时指出错误。

[编辑2]如果您在创建地图时遇到问题,因为您的key_struct没有严格的弱顺序,那么应该这样做。

再次,未经测试,可能包含错误。对于所有的if也是非常低效的,但是......你可以随意用你最喜欢的卡诺图解算器(BMin想到)解决它们。

struct cmp_key_struct 
{ 
    bool operator() (key_struct const & lhs, key_struct const & rhs) const 
    { 
    bool result = (lhs.x < rhs.x); 

    if ((!result) && (lhs.x == rhs.x)) 
    { 
     result = (lhs.y < rhs.y); 

     if ((!result) && (lhs.y == rhs.y)) 
     result = (lhs.z < rhs.z); 
    } 

    return result; 
    } 
}; 

std::map<key_struct, your_value_type, cmp_key_struct> yourMap; 
0

您不需要在地图上使用find_if。如果您尝试将结构用作映射键,如您所说,您需要提供“strict weak ordering”的比较。例如,使用“<”而不是“==”。然后将该比较提供给地图。或者在你的结构中超载<运算符。您可以使用[]运算符或find()方法map执行O(log n)个搜索,其中find_if为O(n)。

+0

这适用于'binary_search'或'lower_bound',但不适用于执行线性搜索的'std :: find_if'。 – 2011-04-19 13:44:53

+0

'find_if'需要一个等式关系,而不是一个严格的弱排序。 – aschepler 2011-04-19 13:46:29

+0

请注意,OP说:“我想要做的是将key_struct作为我地图中的关键字。” 'map'需要严格的弱排序。 – 2011-04-19 13:47:48

0

这是修改后的版本:

struct find_myInt : std::unary_function<key_struct, bool> 
{  
    int myInt;  /// HERE 
    find_myInt(key_struct kStruct):myInt(kStruct.x){}  
    bool operator()(key_struct const& m) const 
    {   
    return m.x == myInt;  
    } 
};