8

我在我的代码中发现了一个错误,我在对结构容器进行排序时忘记使用自定义比较器。这让我想知道它用作小于运算符是什么,因为我没有为结构定义任何内容。

当未定义这些运算符时,对象如何比较 <、> 和 ==?是通过内存地址吗?是否在标准中定义?我在 Google 上找不到任何此类信息。

编辑:

这是我正在使用的课程:

using namespace std;

typedef unsigned id;

class LogEntry {
    id master_id;
    string timestamp;
    string category;
    string message;
    string str_rep;

public:
    LogEntry(id id, string t, string c, string m) :
            master_id(id), timestamp(t), category(c), message(m) {
    }

    string get_timestamp() const {
        return timestamp;
    }

    string get_category() const {
        return category;
    }

    string get_message() const {
        return message;
    }

    string to_string() {
        ostringstream ss;
        ss << master_id << "|" << timestamp << "|" << category << "|"
                << message;
        return ss.str();
    }

    id get_id() const {
        return master_id;
    }
};

编辑2:

我意识到我犯了一个愚蠢的错误。我正在存储一个指向对象的指针向量。因此,指针很可能通过地址进行比较。如果我没有存储指针,我认为它不会编译。

EDIT3:KerrekSB 在他的答案的评论中发布了一个相关的有趣链接:如何完全订购指针?

4

1 回答 1

9

默认比较器是标准模板std::less<T>,它只x < y用于两个对象xy类型T。有很多方法可以工作:

  • T是一种算术基本类型,并且使用了内置运算符。

  • T是一个类类型并且有一个成员operator<

  • 有免费功能operator<(T const &, T const &)

  • 您的用户定义类型具有到内置类型的隐式转换函数,该函数为调用内置类型提供了唯一路径<

此外,可以专门std::less针对您的用户定义类型T

于 2012-11-15T22:16:21.433 回答