Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> การเขียนโปรแกรม C

ความสำคัญของฟังก์ชันแลมบ์ดาใน C/C++


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