c++ 람다 표현식 예제

람다 식을 사용하면 비교 함수를 선언하지 않도록 동일한 결과를 얻을 수 있습니다: __declspec과 같은 Microsoft 관련 한 수정자를 사용하는 경우 매개 변수-선언-절 바로 직후에 lambda 식에 삽입할 수 있습니다. 예: 람다가 암시적 복사 별 캡처를 사용하여 멤버를 캡처하는 경우 해당 멤버 변수의 복사본을 만들지 않습니다: 멤버 변수 m의 사용은 식(*this)m으로 처리되고 *이것은 항상 참조: lambda 식에 의해 암시적으로 캡처됩니다. 호출 가능한 개체를 사용하는 함수에 대한 인수로 자주 사용됩니다. 명명된 함수를 만드는 것보다 간단할 수 있으며 인수로 전달될 때만 사용됩니다. 이러한 경우 lambda 식은 함수 개체를 인라인으로 정의할 수 있으므로 일반적으로 선호됩니다. 이 사용자 정의 변환 함수는 lambda 식의 캡처 목록이 비어 있는 경우에만 정의됩니다. 공용, constexpr, (이후 C ++17) 비 가상, 비 명시적, const noexcept (이후 C ++14) 클로저 개체의 멤버 함수입니다. 람다의 함수 호출 연산자가 즉각적인 함수인 경우 즉각적인 함수입니다. (이후 C ++20) C ++ 11은 다시 사용하지 않고 명명 할 가치가없는 코드의 짧은 조각에 사용할 수있는 인라인 함수를 작성할 수 있도록 lambda 식을 도입했습니다. 가장 간단한 형식람다 표현식은 다음과 같이 정의할 수 있습니다. 당신은 생각할 수 있습니다, 어서, 이것은 오래된 물건입니다, 모든 심각한 개발자는 람다 표현에 대해 알아야한다. 당신은 옳을 지도 모르지만, 그렇지 않습니다. 최근에 나는 람다에 갈색 가방 세션을 만들어 약 15 개발자 중, 우리 중 두 이미 C ++에서 람다와 자바에서 두 개의 다른 사람을 사용했다.

그래서 필요는 거기 밖으로. 흠… 이 예제에는 반환 유형이 없으므로 이 섹션에서는 무엇을 합니까? 그리고 왜 매개 변수 의 목록 후? 그것은 나에게 묻는다면 꽤 좋은 찾고 코드입니다 -it 읽기, 그리고 일반 루프처럼 구조화되어 있지만, 갑자기 for_each가 루프에 대한 일반을 통해 제공하는 장점을 활용할 수 있습니다 – 예를 들어, 올바른 끝 조건이 있음을 보장합니다. 지금, 당신은 궁금해 수 있습니다., 이 킬 성능 하지 않습니다. 글쎄, 여기에 키커가 있습니다 : for_each가 동일한 성능을 가지고 있으며 때로는 일반 용 루프보다 더 빠르다는 것이 밝혀졌습니다. (그 이유 : 루프 언롤링을 활용할 수 있습니다.) 클래스 메서드의 본문에 lambda 식을 사용 하려면 이 포인터를 capture 절에 전달 하여 둘러싸는 클래스의 메서드 및 데이터 멤버에 대 한 액세스를 제공 합니다. 알다시피, 당신은 쉽게 정규 표현으로이 작업을 수행 할 수 있습니다. 하지만 원하지 않는다고 가정해 봅시다. 이 예는 완전히 합법적이며 람다의 진정한 가치를 보여줍니다. 우리는 람다 (이름) 외부에 선언 된 변수를 가지고 람다 내부에서 사용할 수 있습니다. findMatching주소가 람다 함수를 호출하면 그 안에 있는 모든 코드가 실행되고 addr.find가 호출되면 사용자가 전달한 이름에 액세스할 수 있습니다. 우리가 그것을 작동하기 위해 해야 할 유일한 것은 우리가 변수 캡처를 갖고 싶어 컴파일러를 말하는 것입니다.

캡처 사양에 [&]를 두는 것이 아니라 []를 넣음으로써 그렇게 했습니다. 빈 []은 컴파일러가 변수를 캡처하지 않도록 지시하는 반면[&] 사양은 컴파일러에 변수 캡처를 수행하도록 지시합니다. 람다 식이 복사하여 모든 것을 캡처하는 경우(캡처 절 [=]로 암시적으로 또는 문자를 포함하지 않는 캡처를 명시적으로 사용하는 경우(예: [a, b, c]) 클로저 유형에는 지정되지 않은 것으로 선언된 이름 없는 비정적 데이터 멤버가 포함됩니다. 캡처된 모든 엔터티의 복사본을 보유합니다.

Comments are closed.