8

構造体のコンテナをソートするときにカスタムコンパレータを使用するのを忘れたコードのバグを見つけました。これにより、構造体に何も定義しなかったため、less演算子として何を使用しているのか疑問に思いました。

これらの演算子が定義されていない場合、オブジェクトは<、>、および==をどのように比較しますか?メモリアドレスによるものですか?規格で定義されていますか?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;
    }
};

EDIT2:

ばかげた間違いをしたことに気づきました。オブジェクトへのポインタのベクトルを格納していました。したがって、ポインタがアドレスによって比較される可能性が非常に高くなります。ポインタを格納していなかったら、コンパイルされていなかったと思います。

EDIT3:KerrekSBは、関連する彼の回答のコメントに関連する興味深いリンクを投稿しました:ポインターを完全に順序付けるにはどうすればよいですか?

4

1 に答える 1

9

デフォルトのコンパレーターは標準のテンプレートで、これは2 つのオブジェクトとタイプstd::less<T>を使用するだけです。これには多くの方法があります。x < yxyT

  • Tは算術の基本型であり、組み込み演算子が使用されます。

  • Tはクラス型であり、 member を持っていoperator<ます。

  • 無料機能ありoperator<(T const &, T const &)

  • ユーザー定義型には、組み込み型を呼び出すための一意のパスを提供する組み込み型への暗黙的な変換関数があります<

std::lessさらに、ユーザー定義型に特化することもできますT

于 2012-11-15T22:16:21.433 に答える