ฟังก์ชันแลมบ์ดา − 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;
};