cpp_lambda - 8BitsCoding/RobotMentor GitHub Wiki

์ด๋ฆ„์—†๋Š” ํ•จ์ˆ˜~~

์–ธ์ œ์“ธ์ง€ ๋ณด์ž

// ๋ฒกํ„ฐ ์ •๋ ฌํ•˜๊ธฐ 1

#include <algorithm>
#include <vector>

struct Comparer
{
    bool operator()(float a, float b)
    {
        return (a > b);
    }
};

int main() {
    std::vector<float> scores;

    scores.push_back(50.f);
    scores.push_back(88.5f);
    scores.push_back(70.f);

    Comparer comparer;
    std::sort(scores.begin(), scores.end(), comparer);

    return 0;
}
// ๋ฒกํ„ฐ ์ •๋ ฌํ•˜๊ธฐ 2

#include <algorithm>
#include <vector>

bool Sort(float a, float b)
{
    return (a > b);
}

int main() {
    std::vector<float> scores;

    scores.push_back(50.f);
    scores.push_back(88.5f);
    scores.push_back(70.f);

    Comparer comparer;
    std::sort(scores.begin(), scores.end(), Sort);

    return 0;
}

๋ณดํ†ต์€ ์œ„ ๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜๋ฅผ ์‚ฌ์šฉ!

์žฌํ™œ์šฉ ํ•˜์ง€ ์•Š์„ ํ•จ์ˆ˜๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ด ๋งž๋Š” ๊ฑด๊ฐ€??? -> lambda ๋„์ž…!


// ๋žŒ๋‹ค์‹ ์˜ˆ์‹œ

int main() {
    std::vector<float> scores;

    scores.push_back(50.f);
    scores.push_back(88.5f);
    scores.push_back(70.f);

    Comparer comparer;
    std::sort(scores.begin(), scores.end(), [](float a, float b){return (a > b)}]);

    return 0;
}
  • ์ด๋ฆ„์ด ์—†๋Š” ํ•จ์ˆ˜ ๊ฐœ์ฒด
  • ๋‚ดํฌ๋˜๋Š” ํ•จ์ˆ˜

๋žŒ๋‹ค ์‹

[<captures>](<parameters>) <specifiers> -> <return_type>
{
    <body>
}
  • captures : ์บก์ฒ˜ ๋ธ”๋ก
  • parameters : ๋งค๊ฐœ๋ณ€์ˆ˜ ๋ชฉ๋ก
  • specifiers : ์ง€์ •์ž
  • return_type : ๋ฐ˜ํ™˜ํ˜•

ํ•˜๋‚˜๋„ ๋ชจ๋ฅด๊ฒ ๋„ค... ์ž์„ธํ•œ ์„ค๋ช…์€ ์•„๋ž˜์„œ...


captures

  • ๋žŒ๋‹ค ์‹์„ ํ’ˆ์€ ๋ฒ”์œ„ ์•ˆ์— ์žˆ๋Š” ๋ณ€์ˆ˜๋ฅผ ๋žŒ๋‹ค ์‹์— ๋„˜๊ฒจ์ค„๋•Œ ์‚ฌ์šฉ

์บก์ฒ˜์˜ ์ข…๋ฅ˜

  • [] : ๋น„์–ด ์žˆ์Œ, ์บก์ฒ˜ํ•˜์ง€ ์•Š์Œ
  • [=] : ๊ฐ’์— ์˜ํ•œ ์บก์ฒ˜, ๋ชจ๋“  ์™ธ๋ถ€ ๋ณ€์ˆ˜๋ฅผ ์บก์ฒ˜ํ•œ๋‹ค. (๋‹จ, ๋žŒ๋‹ค์‹ ๋‚ด์—์„œ ์ˆ˜์ •๋ถˆ๊ฐ€)
  • [&] : ์ฐธ์กฐ์— ์˜ํ•œ ์บก์ฒ˜, ๋ชจ๋“  ์™ธ๋ถ€ ๋ณ€์ˆ˜๋ฅผ ์บก์ฒ˜
  • [<๋ณ€์ˆ˜ ์ด๋ฆ„>] : ํŠน์ • ๋ณ€์ˆ˜๋ฅผ ๊ฐ’์œผ๋กœ ์บก์ฒ˜ (์—ญ์‹œ, ๋žŒ๋‹ค์‹๋‚ด์—์„œ ์ˆ˜์ •๋ถˆ๊ฐ€)
  • [&<๋ณ€์ˆ˜ ์ด๋ฆ„>] : ํŠน์ • ๋ณ€์ˆ˜๋ฅผ ์ฐธ์กฐ๋กœ ์บก์ฒ˜
// ์บก์ฒ˜๋ฅผ ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ []
// ๋ฐฉ๋ฒ• 1
auto noCapture = []() { std::cout << "No capture" << std::endl; };
noCapture();        // ํ˜ธ์ถœ์€ ์š”๋ ‡๊ฒŒ

// ๋ฐฉ๋ฒ• 2
[]{ std::cout << "No capture2" << std::endl; };
// ๊ฐ’์— ์˜ํ•œ ์บก์ฒ˜ [=]
float score1 = 80.f;
float score2 = 20.f;

auto max = [=]() { return score1 > score2 ? score1 : score2; };

max();
// ์ฐธ์กฐ์— ์˜ํ•œ ์บก์ฒ˜ [&]
float score1 = 80.f;
float score2 = 20.f;

auto max = [&]() { score1 = 60.f; };

max();
// ํŠน์ € ๋ณ€์ˆ˜ ์บก์ฒ˜ [<๋ณ€์ˆ˜ ์ด๋ฆ„>]
float score1 = 80.f;
float score2 = 20.f;

auto max = [score1]() { return score1 > score2 ? score1 : score2; };
// Compile Error
// ํŠน์ € ๋ณ€์ˆ˜ ์ฐธ์กฐ ์บก์ฒ˜ [&<๋ณ€์ˆ˜ ์ด๋ฆ„>]
float score1 = 80.f;
float score2 = 20.f;

auto max = [&score1]() { score1 = 10.f; };
// Compile Error
// ์บก์ฒ˜ ์˜ต์…˜ ์„ž๊ธฐ

auto changeValue = [=, &score1]() {};

parameters

  • ์„ ํƒ์‚ฌํ•ญ์ด๊ณ 
  • () ์ž์ฒด๋ฅผ ์ƒ๋žต๋„ ํ•  ์ˆ˜ ์žˆ๋‹ค.
int main() {
    int score1 = 70;
    int score2 = 85;

    auto add = [](int a, int b) {
        return a+b;
    };

    std::cout << add(score1, score2) << std::endl;
}
// ์ •๋ ฌํ•˜๊ธฐ์— ๋”ฑ ์ ํ•ฉ!
int main() {
    std::vector<float> scores;

    scores.push_back(50.f);
    scores.push_back(88.5f);
    scores.push_back(70.f);

    Comparer comparer;
    std::sort(scores.begin(), scores.end(), [](float a, float b){return (a > b)}]);

    return 0;
}

specifiers

  • ์„ ํƒ์‚ฌํ•ญ
  • mutable
    • ๊ฐ’์— ์˜ํ•ด ์บก์ฒ˜๋œ ๊ฐœ์ฒด๋ฅผ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๊ฒŒํ•จ
    • ๊ดœ์ฐฎ์€ ์–ธ์–ด ๋””์ž์ธ, ํ—ˆ๋‚˜ C++์— ๋„ˆ๋ฌด ๋Šฆ๊ฒŒ ๋“ค์–ด์˜ด.
int main() {
    int value = 100;

    auto foo = [value]() mutable {
        std::cout << ++value << std::endl;
    };

    foo();
}

return_type

  • ์„ ํƒ ์‚ฌํ•ญ
  • ๋ฐ˜ํ™˜ ํ˜•์„ ์ ์ง€ ์•Š์œผ๋ฉด ๋ฐ˜ํ™˜๋ฌธ์„ ํ†ตํ•ด ์œ ์ถ” (๊ฐ€๋…์„ฑ์„ ํ•ด์น  ์ˆ˜ ์žˆ๋‹ค.)

๋žŒ๋‹ค ์‹์˜ ๋‹จ์ 

  • ํ•จ์ˆ˜ ์žฌ์‚ฌ์šฉ์„ฑ์ด ๋‚ฎ๋‹ค
  • ์‚ฌ๋žŒ๋“ค์€ ๋ณดํ†ต ํ•จ์ˆ˜๋ฅผ ์ƒˆ๋กœ ๋งŒ๋“ค๊ธฐ ์ „์— ํด๋ž˜์Šค์— ์žˆ๋Š” ๊ธฐ์กดํ•จ์ˆ˜๋ฅผ ์ฐพ๋Š”๋‹ค.
  • ๋žŒ๋‹ค ํ•จ์ˆ˜๋Š” ๋ˆˆ์— ์ž˜ ๋„์ง€ ์•Š์•„์„œ ๋ชป ์ฐพ์„ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’๊ณ 
  • ์ฝ”๋“œ์˜ ์ค‘๋ณต์„ ์•ผ๊ธฐํ•œ๋‹ค.

์–ธ์ œ์“ฐ๋‚˜?

  • ๊ธฐ๋ณธ์ ์œผ๋กœ ์ด๋ฆ„์ด ์žˆ๋Š” ํ•จ์ˆ˜๋ฅผ ์„ ํ˜ธ
  • ์ž์ž˜ํ•œ ํ•จ์ˆ˜๋Š” ๋žŒ๋‹ค์‹์œผ๋กœ ํ‘œํ˜„! (ํ•œ ์ค„์งœ๋ฆฌ ํ•จ์ˆ˜๋ผ๋“ ์ง€?)
  • ์ •๋ ฌ ํ•จ์ˆ˜ ์ฒ˜๋Ÿผ STL ์ปจํ…Œ์ด๋„ˆ์— ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ „๋‹ฌํ•  ํ•จ์ˆ˜๋“ค์ด ์ข‹์€ ํ›„๋ณด!
โš ๏ธ **GitHub.com Fallback** โš ๏ธ