ریزه میزه – استفاده از Lambda در تابع min

سلام دوستان در پست قبلی در مورد ارسال چندین پارامتر به تابع min برای محاسبه مقدار کمینه صحبت شد. یکی از دوستان در کامنت‌ها پرسیده بودند که از کاربرد لامبدا ها هم بگید. خب اینم یه مثال:

فرض کنید قصد داریم برای تابع min دوتا pair بفرستیم. منظورمون هم از pair‌ همون کلاسی است که در utility تعریف شده و می‌تونه دوتا عضو داشته باشه. در واقع یه دوتایی. مثل (۱و ۲) (۳و ۴) (“salam”, “khbui”). در حالت معمولی وقتی شما دوتا pair رو به تابع min بفرستید، میاد و نگاه میکنه اگه عنصر اول یکی از pair ها از دیگری کمتر بود اون pair  رو به عنوان کمینه برمیگردونه. در غیر این صورت به عنصر دوم نگاه می‌کنه. خب حالا فرض کنید قصد داریم به جای این رفتار پیش فرض، کاری کنیم که بیاد و عنصر اول و دوم رو در هم ضرب کنه، هر کدوم کمتر بود، اون جفت رو به عنوان کمینه برگردونه. خب برای این کار کافیه بدونیم که تابع min می‌تونه بعد از این که عناصری رو که باید کمینشون رو حساب کنه رو دریافت کرد، یه lambda (و یا callable objectهای دیگه) رو به عنوان پارامتر بگیره که میگه عناصر رو چطور با هم مقایسه کن.

خب ما برای مسئلمون باید یه lambda ای تعریف کنیم که دوتا pair رو به عنوان پارامتر میپذیره و باید بگه که اولی کوچکتر از دومی هست یا نه:

خب من برای راحتی ام و این که هی ننویسیم std::pair اومدم و std::pair<int, int> را typedef کردم البته به شیوه C++11 ای. بعدم دوتا pair تعریف کردم و در نهایت تابع std::min رو روی a, b صدا زدم. ولی به جای اینکه به صورت پیش فرض مقایسه بشن من به عنوان پارامتر سوم به تابع min، یه lambda فرستادم که مشخص میکنه a, b به چه صورت با هم مقایسه بشن. به این صورت که اگه ضرب عناصر اولی در هم کوچکتر از ضرب عناصر دومی در هم هست باید true برگردونه (تابع کمینه است دیگر)

به همین سادگی.

۱۰,۱۱۱ total views, 99 views today

Print Friendly, PDF & Email

درباره ی سعید دادخواه

یه برنامه نویس !

همچنین ببینید

ریزه میزه – اندازه گیری زمان اجرای یک قسمت از برنامه در C++11

سلام دوستان امیدوارم حالتون خوب باشه. توی این قسمت قصد دارم که بهتون آموزش بدم …

3
دیدگاه بگذارید

avatar
2 Comment threads
1 Thread replies
0 دنبال کنندگان
 
Most reacted comment
داغ ترین نخ نظرات
2 کامنت گذاران
stackسعید دادخواهstackprogramer کامنت گذاران اخیر
  مشترک شو!  
جدیدترین قدیمی‌ترین دارای بیشترین امتیاز
میخوام باخبر شم از
stackprogramer
Guest

عالی بود.

stackprogramer
Member

یا به عبارتی هدف این ویژگی جدید (Lambda)سی پلاس پلاس ۱۱ این است که امکانات برنامه نویسی فانکشنال را به سی پلاس پلاس اضافه کند.
https://medium.com/@DakshHub/lambdas-the-companion-of-modern-c-b7dfd43b5abb