实施'<'操作者

时间:2016-11-14 20:59:35

标签: c++ dictionary operator-keyword

实施'<'的正确方法是什么?运算符使用以下简单类作为std::map中的键(函数被省略)?

class Person
{
public:
   bool valid = false;
   std::string name = "";
   std::string id = "";
}

3 个答案:

答案 0 :(得分:4)

您可以使用std::tie

class Person
{
public:
    bool valid = false;
    std::string name = "";
    std::string id = "";

    bool operator<(const Person& r) const
    {
        return std::tie(valid, name, id) < std::tie(r.valid, r.name, r.id);
    }
}

<强>解释

std::tie(xs...)创建std::tuple对传递的xs...参数的引用。 Comparison between two std::tuple instances通过按字典顺序比较元素,从而为您的类型提供排序。

更多信息here on cppsamplesin this question

答案 1 :(得分:4)

您可以按照其他答案的建议使用std::tie。如果要在自己的函数中清楚地看到逻辑或者无法访问C ++ 11编译器,可以将其实现为:

class Person
{
   public:
      bool valid = false;
      std::string name = "";
      std::string id = "";

      bool operator<(Person const& rhs) const
      {
         if ( this->valid != rhs.valid )
         {
            return ( this->valid < rhs.valid );
         }
         if ( this->name != rhs.name )
         {
            return ( this->name < rhs.name );
         }
         return ( this->id < rhs.id );
      }
};

答案 2 :(得分:2)

#include <string>
#include <tuple>

class Person
{
public:
   bool valid = false;
   std::string name = "";
   std::string id = "";
};

bool operator<(const Person& l, const Person& r)
{
    return std::tie(l.valid, l.name, l.id) < std::tie(r.valid, r.name, r.id);
}