Dalam kod anda, anda cuba untuk menentukan fungsi pembanding tersuai untuk mengisih elemen dalam std :: tetapkan menggunakan susunan leksikografi dan bukannya susunan angka. Walau bagaimanapun, mesej ralat menunjukkan bahawa terdapat ralat tidak padan jenis dalam pengisytiharan pembanding tersuai anda.
Isu timbul kerana anda mengisytiharkan lex_compare sebagai fungsi dengan dua parameter int64_t yang mengembalikan nilai boolean. Walau bagaimanapun, templat untuk std::set menjangkakan pembanding yang melaksanakan std::less<> templat. std::kurang<> ialah objek fungsi dengan tandatangan berikut:
template <typename T> struct less { bool operator()(const T& a, const T& b) const; };
Untuk menyelesaikan isu ini, anda perlu melaksanakan lex_compare untuk mematuhi std::less<> tandatangan. Berikut ialah pengubahsuaian pada kod anda:
struct lex_compare { bool operator()(const int64_t& a, const int64_t& b) const { stringstream s1, s2; s1 << a; s2 << b; return s1.str() < s2.str(); } }; std::set<int64_t, lex_compare> s;
Kini, struct lex_compare melaksanakan fungsi operator() yang mengambil dua argumen int64_t dan mengembalikan nilai boolean, yang sepadan dengan tandatangan std::less<> . Dengan menyatakan pembanding tersuai ini dalam takrifan std::set anda, anda boleh mengubah suai gelagat susunan set untuk mengisih unsur secara leksikografi.
Atas ialah kandungan terperinci Mengapa Pembanding `std::set` Tersuai Saya Menyebabkan Ralat Tidak Padan Jenis?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!