Komparator Kustom
Kontrol pengurutan
Komparator Kustom adalah pelajaran C++ Academy gratis di CoddyKit. Ini adalah pelajaran 4 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar C++ Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus C++ Academy mencakup 4 pelajaran total.
Mengapa Menggunakan Pembanding Khusus?
Secara bawaan, kontainer terurut menggunakan std::less (menaik) untuk mengurutkan. Pembanding khusus memungkinkan Anda mengubah urutan tersebut, misalnya menjadi menurun atau berdasarkan bidang tertentu.
#include <iostream>
#include <set>
int main() {
std::set<int> ascending{3, 1, 2};
for (int x : ascending) std::cout << x << ' ';
std::cout << '\n';
return 0;
}Urutan Menurun dengan std::greater
Pembanding khusus yang paling sederhana adalah funktor standar std::greater, yang mengurutkan dalam urutan menurun.
#include <iostream>
#include <set>
#include <functional>
int main() {
std::set<int, std::greater<int>> s{3, 1, 2};
for (int x : s) std::cout << x << ' ';
std::cout << '\n';
return 0;
}Pembanding pada map
Pembanding adalah parameter templat ketiga dari std::map. Di sini, kunci diurutkan dari nilai tinggi ke rendah.
#include <iostream>
#include <map>
#include <functional>
int main() {
std::map<int, std::string, std::greater<int>> m{
{1, "one"}, {3, "three"}, {2, "two"}
};
for (const auto& [k, v] : m) std::cout << k << ':' << v << ' ';
std::cout << '\n';
return 0;
}Cara Kerja Pembanding
Pembanding adalah sesuatu yang dapat dipanggil, menerima dua argumen, dan mengembalikan true jika argumen pertama harus muncul sebelum argumen kedua. Pembanding tersebut harus mendefinisikan pengurutan lemah ketat.
#include <iostream>
struct Less {
bool operator()(int a, int b) const { return a < b; }
};
int main() {
Less cmp;
std::cout << std::boolalpha << cmp(2, 5) << '\n';
std::cout << cmp(5, 2) << '\n';
return 0;
}Pembanding Struct Khusus
Definisikan struct funktor Anda sendiri dengan operator(), lalu teruskan tipenya sebagai pembanding.
#include <iostream>
#include <set>
struct ByAbs {
bool operator()(int a, int b) const {
return (a < 0 ? -a : a) < (b < 0 ? -b : b);
}
};
int main() {
std::set<int, ByAbs> s{-5, 3, -1, 4};
for (int x : s) std::cout << x << ' ';
std::cout << '\n';
return 0;
}Mengurutkan String berdasarkan Panjang
Pembanding dapat membandingkan properti apa pun. Di sini, string diurutkan berdasarkan panjang, lalu secara alfabetis sebagai pemecah seri.
#include <iostream>
#include <set>
#include <string>
struct ByLen {
bool operator()(const std::string& a, const std::string& b) const {
if (a.size() != b.size()) return a.size() < b.size();
return a < b;
}
};
int main() {
std::set<std::string, ByLen> s{"bbb", "a", "cc", "dd"};
for (const auto& x : s) std::cout << x << ' ';
std::cout << '\n';
return 0;
}Mengapa Pemecah Seri Penting
Jika pembanding Anda menyatakan bahwa tidak ada elemen yang muncul sebelum elemen lainnya, kontainer menganggap keduanya sama. Dalam set, itu berarti salah satunya dihapus sebagai duplikat.
#include <iostream>
#include <set>
#include <string>
struct LenOnly {
bool operator()(const std::string& a, const std::string& b) const {
return a.size() < b.size();
}
};
int main() {
std::set<std::string, LenOnly> s{"ab", "cd", "x"};
std::cout << s.size() << " elements\n";
return 0;
}Lambda sebagai Pembanding
Anda dapat menggunakan lambda dengan meneruskan tipenya melalui decltype dan lambda itu sendiri ke konstruktor.
#include <iostream>
#include <set>
int main() {
auto cmp = [](int a, int b) { return a > b; };
std::set<int, decltype(cmp)> s(cmp);
s.insert(1);
s.insert(3);
s.insert(2);
for (int x : s) std::cout << x << ' ';
std::cout << '\n';
return 0;
}Pembanding dalam priority_queue
Pembanding juga mengatur std::priority_queue. Dengan std::greater, kontainer tersebut menjadi min-heap.
#include <iostream>
#include <queue>
#include <vector>
#include <functional>
int main() {
std::priority_queue<int, std::vector<int>, std::greater<int>> pq;
pq.push(5); pq.push(1); pq.push(3);
while (!pq.empty()) { std::cout << pq.top() << ' '; pq.pop(); }
std::cout << '\n';
return 0;
}Membandingkan Pasangan
Untuk mengurutkan sekumpulan pasangan berdasarkan elemen kedua, tulislah pembanding yang memeriksa .second.
#include <iostream>
#include <set>
#include <utility>
struct BySecond {
bool operator()(const std::pair<int,int>& a, const std::pair<int,int>& b) const {
return a.second < b.second;
}
};
int main() {
std::set<std::pair<int,int>, BySecond> s{{1, 9}, {2, 3}, {3, 6}};
for (const auto& p : s) std::cout << p.first << ':' << p.second << ' ';
std::cout << '\n';
return 0;
}Pembanding Transparan
Menggunakan std::less<> (dengan tanda kurung sudut kosong) mengaktifkan pencarian heterogen dalam C++14 dan menghindari konversi kunci sementara.
#include <iostream>
#include <set>
#include <functional>
int main() {
std::set<int, std::less<>> s{1, 2, 3};
std::cout << (s.find(2) != s.end() ? "found" : "no") << '\n';
return 0;
}Pemeriksaan Singkat
Uji pemahaman Anda tentang cara pembanding mendefinisikan kesamaan.
Ringkasan
Anda telah mempelajari bahwa pembanding khusus:
- mengubah pengurutan melalui parameter templat pembanding milik kontainer
- dapat berupa
std::greater, struct funktor, atau lambda (melaluidecltype) - mendefinisikan kesamaan berdasarkan ekuivalensi, jadi selalu sertakan pemecah seri agar elemen yang berbeda tidak hilang
Kursus berikutnya: pencarian cepat berbasis hash dengan std::unordered_map.
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Komparator Kustom” gratis?
Ya — teks lengkap “Komparator Kustom” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus C++ Academy, upgrade ke CoddyKit PRO. Kursus C++ Academy mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Komparator Kustom”?
Kontrol pengurutan Kamu berlatih C++ Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai C++ Academy?
Tidak diperlukan pengalaman sebelumnya. C++ Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 4 dari 4.
Berapa lama pelajaran “Komparator Kustom” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran C++ Academy ini?
Ya. Setiap pelajaran C++ Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- std::map
- std::set
- multimap dan multiset
- Komparator Kustom