ฟังก์ชันแลมบ์ดา − Lambda คือฟังก์ชันคือฟังก์ชันอินไลน์ที่ไม่ต้องการการใช้งานใดๆ นอกขอบเขตของโปรแกรมหลัก
ฟังก์ชันแลมบ์ดายังสามารถใช้เป็นค่าโดยตัวแปรในการจัดเก็บ แลมบ์ดาสามารถเรียกได้ว่าเป็นอ็อบเจกต์ที่ฟังก์ชันสามารถเรียกได้ (เรียกว่า functors )
เมื่อใดก็ตามที่คอมไพเลอร์พบคำจำกัดความของฟังก์ชันแลมบ์ดา โดยทั่วไปแล้ว คอมไพเลอร์จะสร้างอ็อบเจ็กต์ที่กำหนดเองสำหรับแลมบ์ดา
ฟังก์ชันแลมบ์ดามีฟังก์ชันการทำงานมากกว่าฟังก์ชันปกติ เช่น มีวิธีการจับภาพเพื่อจับตัวแปรที่ใช้ อย่างไรก็ตาม ตัวแปรที่จับได้จะถือว่าเป็นสมาชิกของอ็อบเจ็กต์
บางครั้งฟังก์ชันแลมบ์ดายังถูกเรียกว่า "วัตถุฟังก์ชัน" ซึ่งมีขอบเขตของตัวเองและสามารถส่งผ่านเป็นพารามิเตอร์ภายในฟังก์ชันปกติได้ ฟังก์ชัน Lambda มีอายุการใช้งานของมันเอง
[ ] - จับภาพ
( ) - พารามิเตอร์ (ไม่บังคับ)
→ - ค่าส่งคืน (ไม่บังคับ)
{...} - ฟังก์ชั่นร่างกาย
ไวยากรณ์ของแลมบ์ดา
[ ]( int a) -> int { return a-1 ;};
จับภาพ – การดักจับเป็นส่วนคำสั่งที่ฟังก์ชันแลมบ์ดาให้การเข้าถึงตัวแปรที่มีอยู่ในขอบเขตเฉพาะหรือบล็อกที่ซ้อนกัน
เราสามารถจับค่าของตัวแปรที่มีได้โดยใช้สองวิธี
-
จับวัตถุตามชื่อ – การจับวัตถุโดยใช้ชื่อจะทำให้คัดลอกฟังก์ชันแลมบ์ดาในเครื่อง
เราสามารถเข้าใจแนวคิดนี้ด้วยตัวอย่างต่อไปนี้ -
int main(){ set s; //Adding the elements to set int i=20; for_each(s.begin(),s.end(), [i](T& elem){ cout<<elem.getVal()*i<<endl; } }
ในตัวอย่างข้างต้น ค่าถูกจับโดยการสร้างสำเนาในเครื่องของฟังก์ชันแลมบ์ดา
-
การจับวัตถุโดยการอ้างอิง – การจับวัตถุโดยการอ้างอิงจะควบคุมบริบทของฟังก์ชันแลมบ์ดา ดังนั้น ค่าที่จับโดยออบเจกต์ฟังก์ชันหรือฟังก์ชันแลมบ์ดาสามารถเปลี่ยนแปลงได้
เราสามารถเข้าใจสิ่งนี้ได้ด้วยตัวอย่างต่อไปนี้ −
int main(){ sets; //Adding elements to the set int result=0; for_each(s.begin(),s.end(), [&result](&T elem){ result+= elem.getVal();}); cout<<result<<endl; }
แลมบ์ดาภายในฟังก์ชันสมาชิก
เรารู้ว่าฟังก์ชันแลมบ์ดาสามารถใช้เป็นพารามิเตอร์ภายในฟังก์ชันปกติได้ ตัวอย่างเช่น
class func{ public: func(set<T>s): s1(s){} void func(){ remove_if(s1.begin(),s1.end(), [this](int i) ->bool {return (i<level);}); } private: set<T>s1; int result; };