使用结构谓词的C ++ STD :: find_if

时间:2011-04-19 13:31:37

标签: c++

 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的信息。如果我用x = 2设置key_struct,那么我只想返回int x等于2的位置。如果我设置x = 2和y =“testString”,那么我想只返回x的值的子集= 2且y =“testString”。

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

3 个答案:

答案 0 :(得分:2)

你总是想和x比较吗?或者仅当x!= 0?

顺便说一下,你的struct构造函数中似乎有一个错误:没有名为myInt的成员,因此它应该是:find_myInt(key_struct kStruct) : x(kStruct.x){}。但这无关紧要,无论如何都需要改变。

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

要使用它,请创建一个您想要匹配的结构,正如您从代码中看到的那样,它只会尝试匹配x > 0, y != "" and z != ""。因此,如果您将“搜索”结构设置为x = 5, y = "" and z = "",它将匹配x == 5(y&amp; z可以是其他)的每个键。

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;

答案 1 :(得分:0)

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

答案 2 :(得分: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;     
    }
 };