std::find how does it work? operator==

前端 未结 2 583
夕颜
夕颜 2021-01-22 00:34

If I have a class

class Point
{
public:
  Point() {}
  Point(int _col, int _row) : row(_row), col(_col) {}
  int row, col;
};

how can I use std

2条回答
  •  野性不改
    2021-01-22 00:56

    Unless your types are PODs fundamental types, you will need to provide an equality function, member or not.

    There are two fundamental versions of std::find, one that assumes an equality operator and the other uses an equality function you supply.

    I recommend that you add operator== and operator< to any class that will be compared for equality or ordered.

    Here's an updated version of your class:

    class Point
    {
      int x;  // These are private by default.
      int y; 
      public:  
        Point(int new_x, int new_y) : x(new_x), y(new_y)
        { ; }
        bool operator==(const Point& p) const
        {
          return (x == p.x) && (y == p.y);
        }
    };
    

    The member method operator== allows comparison without exposing the values to friends or the public.

    If you want to use a free standing comparison function, you will need to either make the values public or make the function a friend:

    class Point
    {
      int x;  // These are private by default.
      int y; 
      public:  
        Point(int new_x, int new_y) : x(new_x), y(new_y)
        { ; }
        friend bool operator==(const Point& a, const Point& b);
    };
    
    bool operator==(const Point& a, const Point& b)
    {
        return (a.x == b.x) && (a.y == b.y);
    }
    

    If you want to use the free standing function with std::find, the example would be:

    std::vector point_container;
    //...
    Point p;
    std::vector::const_iterator iter;
    iter = std::find(point_container.begin(), point_container.end(),
                     p,
                     Equal_Points);
    

    Where Equal_Points is a free standing function that can compare the members of two Points.

提交回复
热议问题