我该如何重载'<'在这个班的地图?

时间:2016-05-27 19:32:55

标签: c++ dictionary

我有课程tranzitiemap<int, map<tranzitie, int>>。我应该如何重载< tranzitie运算符以使地图正常工作?它包含两个字符和一个字符串。我试过了,但是发现()不会很好,考虑到价值相等,即使它们不是(在我看来)。

class tranzitie{
public:
    char litera;
    char top;
    string newst;

    bool operator==(const tranzitie& x);
    tranzitie& operator=(const tranzitie& x);
    tranzitie (const tranzitie& x);
    tranzitie(){};
    inline bool operator< (const tranzitie& rhs) const;
};

2 个答案:

答案 0 :(得分:1)

首选实现operator<作为自由函数而不是成员函数。如果您需要访问operator<函数中的私有成员,则应将operator<函数设为朋友。在您的情况下,由于tranzitie的成员是公开的,因此不需要它。

最容易记住的模式可能就是:

bool operator<(const tranzitie& lhs, const tranzitie& rhs) {
  if (lhs.litera < rhs.litera) return true;
  if (rhs.litera < lhs.litera) return false;
  if (lhs.top < rhs.top) return true;
  if (rhs.top < lhs.top) return false;
  return lhs.newst < rhs.newst;
}

记住的最佳模式可能就是:

bool operator<(const tranzitie& lhs, const tranzitie& rhs) {
  return
    std::tie(lhs.litera, lhs.top, lhs.newst) <
    std::tie(rhs.litera, rhs.top, rhs.newst);
}

答案 1 :(得分:0)

您应该比较所有数据成员:

 bool operator< (const tranzitie& rhs) const {
     if( litera == rhs.litera ) {
        if( top == rhs.top ) {
            return newst < rhs.newst;
        }
        return top < rhs.top;
     }
     return litera < rhs.litera;
 }