Memilih Callable
Lambda vs bind vs pointer
Memilih Callable 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.
Perangkat Pemanggilan
C++ menyediakan beberapa cara untuk meneruskan perilaku: penunjuk fungsi, lambda, funktor, std::bind, dan std::function. Masing-masing sesuai untuk kebutuhan yang berbeda.
- Kompromi antara kecepatan dan fleksibilitas adalah pertimbangan yang umum.
- Keterbacaan juga penting.
#include <iostream>
int twice(int x) { return x * 2; }
int main() {
int (*fp)(int) = twice;
auto lam = [](int x) { return x * 2; };
std::cout << fp(5) << ' ' << lam(5) << '\n';
return 0;
}Kapan Menggunakan Penunjuk Fungsi
Gunakan penunjuk fungsi saat Anda memerlukan fungsi panggil balik kecil tanpa keadaan serta menginginkan kompatibilitas dengan C atau tanpa biaya tambahan.
#include <iostream>
void logMsg(const char* m) { std::cout << "LOG: " << m << '\n'; }
int main() {
void (*handler)(const char*) = logMsg;
handler("started");
return 0;
}Kapan Menggunakan Lambda
Lambda adalah pilihan modern utama: ringkas, dapat menangkap keadaan, dan dapat disisipkan dengan baik oleh kompiler dalam templat dan algoritma.
#include <iostream>
#include <vector>
#include <algorithm>
int main() {
std::vector<int> v = {3, 1, 4, 1, 5};
std::sort(v.begin(), v.end(), [](int a, int b) { return a > b; });
for (int x : v) std::cout << x << ' ';
std::cout << '\n';
return 0;
}Menangkap Keadaan dalam Lambda
Lambda menangkap variabel di sekitarnya, sesuatu yang tidak dapat dilakukan penunjuk fungsi, sehingga lambda ideal untuk fungsi panggil balik yang memahami konteks.
#include <iostream>
#include <vector>
#include <algorithm>
int main() {
int threshold = 3;
std::vector<int> v = {1, 2, 3, 4, 5};
int c = std::count_if(v.begin(), v.end(), [threshold](int x) { return x > threshold; });
std::cout << c << '\n';
return 0;
}Kapan Menggunakan Funktor
Funktor (struktur dengan operator()) cocok untuk operasi bernama yang dapat digunakan kembali, yang mungkin menyimpan konfigurasi dan digunakan di banyak tempat.
#include <iostream>
#include <vector>
#include <algorithm>
struct AboveThreshold {
int limit;
bool operator()(int x) const { return x > limit; }
};
int main() {
std::vector<int> v = {1, 5, 2, 8};
std::cout << std::count_if(v.begin(), v.end(), AboveThreshold{4}) << '\n';
return 0;
}Lambda vs bind
Keduanya dapat mengisi sebagian argumen terlebih dahulu. Versi lambda biasanya lebih jelas dan lebih mudah dioptimalkan oleh kompiler, jadi pilihlah lambda daripada std::bind.
#include <iostream>
int power(int base, int exp) {
int r = 1;
for (int i = 0; i < exp; ++i) r *= base;
return r;
}
int main() {
auto square = [](int x) { return power(x, 2); };
std::cout << square(6) << '\n';
return 0;
}Kapan Menggunakan std::function
Gunakan std::function saat Anda harus menyimpan objek yang dapat dipanggil dengan tipe konkret yang tidak diketahui, misalnya sebagai anggota kelas atau dalam wadah.
#include <iostream>
#include <functional>
#include <vector>
int main() {
std::vector<std::function<int(int)>> pipeline;
pipeline.push_back([](int x) { return x + 1; });
pipeline.push_back([](int x) { return x * 3; });
int v = 2;
for (auto& f : pipeline) v = f(v);
std::cout << v << '\n';
return 0;
}Templat Menghindari Biaya Tambahan
Jika suatu fungsi hanya perlu menerima objek yang dapat dipanggil, bukan menyimpannya, parameter templat mempertahankan kinerja penuh dengan menghindari penghapusan tipe.
#include <iostream>
template <typename F>
int applyTwice(int x, F f) { return f(f(x)); }
int main() {
std::cout << applyTwice(3, [](int n) { return n + 10; }) << '\n';
return 0;
}Peringkat Kinerja
Secara kasar: objek yang dapat dipanggil berbasis templat atau lambda tanpa tangkapan adalah yang tercepat, penunjuk fungsi mendekati kecepatan tersebut, dan std::function adalah yang paling lambat karena indireksi dan kemungkinan alokasi.
#include <iostream>
#include <functional>
int main() {
auto fast = [](int x) { return x + 1; };
std::function<int(int)> flexible = fast;
std::cout << fast(1) << ' ' << flexible(1) << '\n';
return 0;
}Panduan Pengambilan Keputusan
Panduan singkat:
- Perlu menyimpan objek apa pun yang dapat dipanggil?
std::function. - Hanya menerima satu objek dalam fungsi generik? parameter templat.
- Perilaku sebaris yang memiliki keadaan? lambda.
- API C atau tanpa keadaan? penunjuk fungsi.
#include <iostream>
#include <functional>
void runStored(const std::function<void()>& cb) { cb(); }
template <typename F>
void runGeneric(F f) { f(); }
int main() {
runStored([] { std::cout << "stored\n"; });
runGeneric([] { std::cout << "generic\n"; });
return 0;
}Menyatukan Semuanya
Sistem peristiwa kecil mungkin menerima penangan secara umum, tetapi menyimpannya dalam std::function agar dapat dipanggil nanti.
#include <iostream>
#include <functional>
#include <vector>
struct Dispatcher {
std::vector<std::function<void(int)>> handlers;
template <typename F> void on(F f) { handlers.emplace_back(f); }
void fire(int e) { for (auto& h : handlers) h(e); }
};
int main() {
Dispatcher d;
d.on([](int e) { std::cout << "got " << e << '\n'; });
d.fire(7);
return 0;
}Pemeriksaan Singkat
Uji pemahaman Anda tentang pemilihan objek yang dapat dipanggil.
Ringkasan
Anda telah mempelajari cara memilih objek yang dapat dipanggil:
- penunjuk fungsi untuk fungsi panggil balik tanpa keadaan yang kompatibel dengan C
- lambda sebagai pilihan utama untuk perilaku sebaris yang memiliki keadaan
- funktor untuk operasi bernama yang dapat digunakan kembali
- parameter templat saat hanya menerima objek yang dapat dipanggil (paling cepat)
std::functionsaat Anda harus menyimpan objek yang tipe konkretnya tidak diketahui
Kursus Objek Fungsi dan std::bind telah selesai.
Belajar C++ dengan tutor AI — gratis
Tulis dan jalankan kode asli di browser kamu, dapatkan bantuan instan dari tutor AI 24/7, dan lanjutkan di mana kamu tinggalkan di web atau aplikasi.
- Kursus
- 51
- Pelajaran
- 203
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Memilih Callable” gratis?
Ya — teks lengkap “Memilih Callable” 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 “Memilih Callable”?
Lambda vs bind vs pointer 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 “Memilih Callable” 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
- Pointer Fungsi
- std::function
- std::bind
- Memilih Callable