นิพจน์แลมบ์ดา: การจับค่า mutable generic
เขียนแลมบ์ดาที่มีการจับค่า ความหมายแบบ mutable และพารามิเตอร์ auto แบบทั่วไป
นิพจน์แลมบ์ดา: การจับค่า mutable generic เป็นบทเรียน C++ Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน C++ Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส C++ Academy มีบทเรียนทั้งหมด 4 บทเรียน
แลมบ์ดาคืออะไร
แลมบ์ดา คือออบเจ็กต์ฟังก์ชันนิรนามแบบแทรกในจุดใช้งาน ใช้ในกรณีที่มิฉะนั้นจะต้องเขียนฟังก์ชันขนาดเล็กที่ตั้งชื่อไว้ หรือโครงสร้างที่มี operator()
auto square = [](int x) { return x * x; };
std::cout << square(5); // 25โครงสร้างไวยากรณ์
แลมบ์ดาประกอบด้วยสี่ส่วน:
[capture]— ตัวแปรจากขอบเขตโดยรอบที่จะนำมาใช้(parameters)— เช่นเดียวกับรายการพารามิเตอร์ของฟังก์ชัน-> return_type— ไม่บังคับ และมักอนุมานได้{ body }
การจับค่าแบบว่าง
[] หมายถึง "ไม่จับสิ่งใดเลย" แลมบ์ดาจะเข้าถึงได้เฉพาะตัวแปรโกลบอลและตัวแปรสแตติก
auto add = [](int a, int b) { return a + b; };การจับค่าโดยการคัดลอก
ระบุตัวแปรไว้ในข้อกำหนดการจับค่าเพื่อคัดลอกตัวแปรเหล่านั้นเข้าไปในแลมบ์ดา
int n = 5;
auto times = [n](int x) { return x * n; };
n = 10;
std::cout << times(3); // 15 (captured n was 5)การจับโดยการอ้างอิง
เติม & ไว้ข้างหน้าเพื่อจับโดยการอ้างอิง การเปลี่ยนแปลงภายในแลมบ์ดาจะส่งผลต่อตัวแปรภายนอก
int counter = 0;
auto inc = [&counter]() { ++counter; };
inc(); inc(); inc();
std::cout << counter; // 3การจับค่าเริ่มต้น: [=] และ [&]
จับทุกสิ่งที่ใช้โดยการคัดลอกด้วย [=] หรือจับทุกสิ่งโดยการอ้างอิงด้วย [&] โปรดใช้อย่างระมัดระวัง — เมื่อทำได้ควรระบุสิ่งที่จับอย่างชัดเจน
auto f = [=]() { return a + b; }; // copies a, b
auto g = [&]() { return a + b; }; // references a, bแลมบ์ดาที่แก้ไขค่าได้
โดยค่าเริ่มต้น ค่าที่จับโดยการคัดลอกจะเป็น const ภายในแลมบ์ดา เพิ่ม mutable เพื่ออนุญาตให้แก้ไขค่าเหล่านั้น — การเปลี่ยนแปลงจะมีผลเฉพาะสำเนาในแลมบ์ดาเท่านั้น
int n = 5;
auto f = [n]() mutable {
n += 1; // OK because of mutable
return n;
};
f(); f(); // returns 6, then 7
std::cout << n; // still 5 in outer scopeการอนุมานชนิดข้อมูลที่ส่งคืน
คอมไพเลอร์จะอนุมานชนิดข้อมูลที่ส่งคืนจากเนื้อหาฟังก์ชัน โปรดระบุอย่างชัดเจนเมื่อจำเป็น
auto half = [](int x) -> double { return x / 2.0; };แลมบ์ดาทั่วไป (C++14)
ใช้ auto ในรายการพารามิเตอร์เพื่อสร้างแลมบ์ดาทั่วไปที่ทำงานกับชนิดข้อมูลใดก็ได้
auto print = [](const auto& x) { std::cout << x << "\n"; };
print(42); // int
print("hello"); // const char*
print(3.14); // doubleแลมบ์ดาเป็นอาร์กิวเมนต์ของฟังก์ชัน
อัลกอริทึมของ STL ยอมรับแลมบ์ดาในฐานะเงื่อนไขตรวจสอบและการแปลงข้อมูล
std::vector<int> v = {5, 2, 8, 1};
std::sort(v.begin(), v.end(), [](int a, int b) { return a > b; });แลมบ์ดาคือออบเจ็กต์ฟังก์ชัน
เบื้องหลังการทำงาน คอมไพเลอร์จะสร้างคลาสที่มี operator() คุณสามารถจัดเก็บแลมบ์ดาไว้ใน std::function หรือ auto ได้
ตรวจสอบความเข้าใจ
ภายในแลมบ์ดา [n](int x) { return x * n; } คุณสามารถกำหนดค่าให้ n ได้หรือไม่ โดยไม่ทำให้แลมบ์ดาเป็น mutable
สรุปทบทวน
แลมบ์ดาคือออบเจ็กต์ฟังก์ชันนิรนามแบบแทรกในจุดใช้งาน จับค่าโดยการคัดลอกหรือโดยการอ้างอิง ใช้ mutable เพื่อแก้ไขค่าที่จับโดยการคัดลอก และใช้พารามิเตอร์ auto สำหรับแลมบ์ดาทั่วไปใน C++14 ขึ้นไป
เรียนรู้ C++ ด้วย AI tutor — ฟรี
เขียนและเรียกใช้โค้ดจริงในเบราว์เซอร์ของคุณ รับความช่วยเหลือทันทีจาก AI tutor 24/7 และเรียนรู้ต่อจากที่คุณหยุดบนเว็บหรือในแอป
- คอร์ส
- 51
- บทเรียน
- 203
คำถามที่พบบ่อย
บทเรียน “นิพจน์แลมบ์ดา: การจับค่า mutable generic” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “นิพจน์แลมบ์ดา: การจับค่า mutable generic” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส C++ Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส C++ Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “นิพจน์แลมบ์ดา: การจับค่า mutable generic”
เขียนแลมบ์ดาที่มีการจับค่า ความหมายแบบ mutable และพารามิเตอร์ auto แบบทั่วไป คุณปฏิบัติ C++ Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน C++ Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน C++ Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน
บทเรียน “นิพจน์แลมบ์ดา: การจับค่า mutable generic” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน C++ Academy นี้ได้ไหม
ได้ บทเรียน C++ Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- auto decltype และการอนุมานชนิด
- range-based for nullptr และ enum class
- นิพจน์แลมบ์ดา: การจับค่า mutable generic
- การผูกแบบมีโครงสร้างและ if-init ใน C++17