3

如何重载并将<(小于)比较器传递给一组整数对?这是我当前的代码:

class A{
public:
    typedef std::pair<int, int> pair_type;  

    bool operator<(const pair_type& a, const pair_type& b){ 
        if (a.first < b.first) return true;
        else if ( (a.first == b.first) && (a.second < b.second) ) return true;
        else return false;
    }

private:
    std::set< pair_type > edge_;
};

如果我尝试编译此代码,则会收到以下错误:

error: 'bool A::operator<(const pair_type&, const pair_type&)' must take exactly one argument

我该如何解决?

4

4 回答 4

6
class A{
public:
    typedef std::pair<int, int> pair_type;  

    struct compare {
        bool operator()(const pair_type& a, const pair_type& b) {
          if (a.first < b.first) return true;
          else if ( (a.first == b.first) && (a.second < b.second) ) return true;
          else return false;
        }   
    };

  private:
    std::set<pair_type, compare> edge_;
};
于 2013-03-02T18:20:45.003 回答
5

您应该将运算符重载定义为类成员(使用单个参数,通常是同一类的另一个实例):

class pair_type : public std::pair<int, int>
{
public:
    bool operator<(const pair_type &comp) const
    {
        if (this->first < comp.first) return true;
        else if ( (this->first == comp.first) && (this->second < comp.second) ) return true;
        else return false;
    }
};
于 2013-02-28T06:15:34.733 回答
2

您的运算符应该是自由函数(不是成员函数),因为它与类没有任何关系A

于 2013-02-28T06:11:13.563 回答
2

C++11开始,您还可以使用lambda 表达式而不是定义比较器结构:

using pair_type = std::pair<int, int>;

auto comp = [](const pair_type& a, const pair_type& b) {
    return (a.first < b.first) || ((a.first == b.first) && (a.second < b.second));
};

我还压缩了您的比较器代码以节省两行。现在,您可以通过以下方式定义您的集合:

std::set<pair_type, decltype(comp)> edge_(comp);

但是,如果您想将上述比较器用于作为类成员的集合,那么它会不太舒服,因为您还必须将比较器传递给set 的构造函数,如上所示。这意味着,您必须在构造函数定义的初始化列表中交出比较器:

class A{
public:
    A() : edge_(comp) {}

private:
    std::set<pair_type, decltype(comp)> edge_;
};

Ideone 上的代码

于 2018-06-06T19:27:58.783 回答