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

||
 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 \”。 我相信我的方法很接近,但是我想我缺少一些东西。有想法吗?
已邀请:
您是否一直想与x进行比较?或仅当x!= 0时? 顺便说一句,您的struct构造函数中似乎有一个错误:没有名为
myInt
的成员,因此应该是:
find_myInt(key_struct kStruct) : x(kStruct.x){}
。但这没关系,无论如何都需要更改它。 这是我会尝试的。这未经测试,可能包含错误,并且布尔返回值的“计算”效率极低。无论如何... 要使用它,请创建一个要与之匹配的结构,如从代码中可以看到的,只有在try3ѭ时,它才会尝试匹配。因此,如果将\“ search \”结构设置为
x = 5, y = \"\" and z = \"\"
,它将匹配every5ѭ的每个键(y&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
来说,效率也相当低下,但是,好吧……随时随便用您最喜欢的Karnaugh地图求解器将它们排除掉(想到的是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;
这是更正的版本:
 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;     
    }
 };
您不需要在地图上使用
find_if
。如您所说,如果您尝试将struct用作映射键,则需要提供“严格弱排序”的比较。例如,使用\“ <\”代替\“ == \”。然后将该比较提供给地图。或在结构中重载
<
运算符。您可以使用
[]
运算符或
map
find()
方法进行O(log n)搜索,其中
find_if
是O(n)。

要回复问题请先登录注册