Saya mencoba mengubah urutan default item dalam satu set bilangan bulat menjadi leksikografik, bukan numerik, dan saya tidak bisa mendapatkan yang berikut untuk dikompilasi dengan g ++:
file.cpp:
bool lex_compare(const int64_t &a, const int64_t &b)
{
stringstream s1,s2;
s1 << a;
s2 << b;
return s1.str() < s2.str();
}
void foo()
{
set<int64_t, lex_compare> s;
s.insert(1);
...
}
Saya mendapatkan kesalahan berikut:
error: type/value mismatch at argument 2 in template parameter list for ‘template<class _Key, class _Compare, class _Alloc> class std::set’
error: expected a type, got ‘lex_compare’
apa yang saya lakukan salah?
std::set<int64_t, decltype(&lex_compare)> s(&lex_compare)
1. Solusi C ++ 20 modern
Kami menggunakan fungsi lambda sebagai pembanding. Seperti biasa, pembanding harus mengembalikan nilai boolean, yang menunjukkan apakah elemen yang diteruskan sebagai argumen pertama dianggap berada sebelum argumen kedua dalam urutan lemah ketat spesifik yang ditentukannya .
Demo online
2. Solusi C ++ 11 modern
Sebelum C ++ 20 kita perlu meneruskan lambda sebagai argumen untuk menyetel konstruktor
Demo online
3. Mirip dengan solusi pertama, tetapi dengan fungsi bukan lambda
Jadikan pembanding seperti fungsi boolean biasa
Kemudian gunakan dengan cara ini:
Demo online
atau begini:
Demo online
4. Solusi lama menggunakan struct dengan
()
operatorDemo online
5. Solusi alternatif: buat struct dari fungsi boolean
Ambil fungsi boolean
Dan buat struct dari itu menggunakan
std::integral_constant
Terakhir, gunakan struct sebagai pembanding
Demo online
sumber
Jawaban Yacoby menginspirasi saya untuk menulis adaptor untuk mengenkapsulasi pelat boiler functor.
Wow, saya pikir itu sepadan dengan masalahnya!
sumber
Anda dapat menggunakan pembanding fungsi tanpa membungkusnya seperti ini:
yang menjengkelkan untuk mengetik setiap kali Anda memerlukan satu set jenis itu, dan dapat menyebabkan masalah jika Anda tidak membuat semua set dengan pembanding yang sama.
sumber
std::less<>
saat menggunakan kelas khusus denganoperator<
Jika Anda berurusan dengan sekumpulan kelas kustom Anda yang telah
operator<
ditentukan, maka Anda bisa menggunakanstd::less<>
.Seperti disebutkan di http://en.cppreference.com/w/cpp/container/set/find C ++ 14 telah menambahkan dua
find
API baru :yang memungkinkan Anda melakukan:
main.cpp
Kompilasi dan jalankan:
Info lebih lanjut tentang
std::less<>
dapat ditemukan di: Apa itu pembanding transparan?Diuji pada Ubuntu 16.10,
g++
6.2.0.sumber