C++ Academy · บทเรียน

นิพจน์แลมบ์ดา: การจับค่า mutable generic

เขียนแลมบ์ดาที่มีการจับค่า ความหมายแบบ mutable และพารามิเตอร์ auto แบบทั่วไป

บทเรียน 3 จาก 413 ขั้นตอน

นิพจน์แลมบ์ดา: การจับค่า 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. auto decltype และการอนุมานชนิด
  2. range-based for nullptr และ enum class
  3. นิพจน์แลมบ์ดา: การจับค่า mutable generic
  4. การผูกแบบมีโครงสร้างและ if-init ใน C++17
← กลับไปที่ C++ Academy