2026-03-16(월) std::map과 Lambda

조범근·2026년 3월 16일

TIL

목록 보기
19/25

C++ Week 4

여러번 반복하고 사용해도 다음날이면 잊어먹고 손에 익숙해지지않는다. 계속 반복해서 학습하는게 좋을 것 같음

Study

알고리즘 2문제, 과제 4번


Today I Learned


1. std::map의 이해

Reason

// 1. 일단 map 선언
std::map<std::string, PotionRecipe> recipeMap;
std::vector<PotionRecipe> recipes;

// 2. vector를 돌면서 map에 추가
for (const auto& p : recipes) {
    recipeMap[p.potionName] = p; 
}

recipeMap[p.potionName] = p가 어떻게 되는거냐면 PotionRecipe의 생성자는 potionNameingredients을 받는걸로 되어있어서 이름표는 potionName으로 붙이고 그 내용물(Value)는 p객체 통째로 맵에 복사해서 넣는거다.
즉, p.potionName을 '이름표(Key)'로 쓰고, p 객체 자체를 '내용물(Value)'로 저장





2. Lambda란 무엇인가

Reason

// 1. 함수를 따로 정의한다.
bool IsHealingPotion(const PotionRecipe& p) {
    return p.potionName == "회복 포션"; 
}

// 2. 사용한다.
auto it = std::find_if(recipes.begin(), recipes.end(), IsHealingPotion);

일단 람다라는게 왜 필요한지 알아는데, 일회용 함수를 대체하기 위함
std::sortture를 반환하는 요소를 찾기 위해 compare 함수를 쓸때가 있지만, 딱 여기서만 쓰이는 로직인데도 함수 정의는 클래스 밖이나 다른 곳에 있어야해서 위아래로 왔다갔다 해야하는게 불편하다.
그리고 또 구조체의 연산자 오버로딩 bool operator<같은걸로 하는 방법도 있지만 코드가 너무 길고 복잡해진다.

그래서 등장한게 이름 없는 일회용 함수 람다(Lambda)이다.
auto myLambda = [캡처] (매개변수) { 본문 };

[ ]캡처(Capture Clause) = 람다 외부에 있는 변수를 안으로 들여보내는 통로

  • [&] = 외부의 모든 변수를 참조로 가져온다. (원본 수정 가능, 효율적)
  • [=] = 외부의 모든 변수를 복사해서 가져온다. (원본 보호)
  • [name] = name이라는 변수만 가져온다.

( ) 매개변수 (Parameter List) = 일반 함수와 같다. find_if가 벡터의 요소를 하나씩 꺼내서 이 인자로 전달 해줌

{ } 본문 (Function body) = 실제 비교 로직이 들어가는 곳

std::find_if는 람다를 사용 할 수 있어서 find대신 쓰는 것

auto it = std::find_if(recipes.begin(), recipes.end(), [&](const PotionRecipes& p) { return p.potionName == Name; }

return을 만나면 함수가 종료 되는거 아닌가요?

일회용 함수인 람다만 종료됨.
그렇다는 것은 람다는 하나를 찾으면 종료되기 때문에
여러개의 값을 출력하고싶다. = for반복문람다를 이용해 찾을때마다 출력

여러개의 값을 벡터에 넣고싶다 = 벡터를 만들고 for(for const auto&p : recipes)과 람다를 이용해 찾을때마다 push_back

여기서 'it'은 주소값을 넘겨주기때문에 포인터처럼 사용해야함




복습

  • std::map
    1. std::map<string, int> my_map; 선언
    2. my_map[string] = int; 할당
  • 람다(Lambda)
    auto it = std::find_if(recipes.begin(), recipes.end(), [&](const PotionRecipes& p) { return p.potionName == Name; }

0개의 댓글