고차리스트 함수에 대한 C ++ 11 지원


13

대부분의 함수형 프로그래밍 언어 (예 : 커먼 리스프, 계획 / 라켓, Clojure의, 하스켈, 스칼라, OCaml로, SML)은 같은 목록에 몇 가지 일반적인 higher-order 함수, 지원 map, filter, takeWhile, dropWhile, foldl, foldr등 (참조 , 커먼 리스프, 계획 / 라켓을 Clojure 단계별 참조 시트 , Haskell , Scala , OCamlSML 설명서.)

C ++ 11에는 목록에 동등한 표준 메소드 또는 함수가 있습니까? 예를 들어, 다음 Haskell 스 니펫을 고려하십시오.

let xs = [1, 2, 3, 4, 5]
let ys = map (\x -> x * x) xs

현대 표준 C ++에서 두 번째 표현을 어떻게 표현할 수 있습니까?

std::list<int> xs = ... // Initialize the list in some way.
std::list<int> ys = ??? // How to translate the Haskell expression?

위에서 언급 한 다른 고차 함수는 어떻습니까?
C ++로 직접 표현할 수 있습니까?


예, 그러나 이중 연결 목록의 특정 구현보다 더 일반적인 개념으로 작동합니다. 이 영역에서 파이썬의 작업과 마찬가지로. 특정 데이터 구조에 묶는 것이 훨씬 좋습니다. Data.SequenceHaskell에서 이러한 작업을 시도한 적이 있습니까? 비교적 추악합니다.

"비교적 추악합니다."
Giorgio

의 동일한 작업과 비교했습니다 [a]. 전주곡 기능을 숨기거나 전주곡을 해킹하거나 다른 덜 직관적 인 이름을 선택해야합니다.

아마도 당신이 옳을 수도 있지만,이 질문의 주제는 C ++에서 공통 목록 고차 함수를 표현하는 방법이 아니라 Haskell의 Data.Sequence에서 유사한 함수를 구현하는 방법이 아닙니다.
Giorgio

1
@delnan 나는 Haskell이 그 접근 방식에 훨씬 일반적 이라고 주장합니다 . Functor, Foldable그리고 Traversable내가 생각할 수있는 것처럼 추상적 인 방법으로 이것을 달성하십시오. Data.Sequence이 모든 것의 인스턴스이므로 할 수 있습니다 fmap (\x -> x * x) xs. map되어 fmap초보자를위한 전문.
Alec

답변:


16

훨씬 더, C ++에는 그러한 기능이 있으며, 알고리즘을 살펴보십시오 (또는 C ++ 11 추가 ) 헤더 :

std::transform
std::for_each
std::remove_copy_if

컨테이너와 함께 쉽게 사용할 수 있습니다.

예를 들어 코드를 다음과 같이 표현할 수 있습니다 (쉽게 코딩하기 위해 C ++ 11 람다로).

std::vector<int> x = {1, 2, 3, 4, 5};
std::vector<int> y;
std::transform(x.begin(), x.end(), std::back_inserter(y), [](int elem){ return elem * elem; });

덜 직관적이지만 std::transform새로운 컨테이너를 반환하는 기능으로 호출을 쉽게 래핑 할 수 있습니다 ( move더 나은 성능을 위해 의미론이 있음).


감사. 며칠 전에 작성한 코드를 단순화하고 싶습니다.이 코드는 훨씬 짧아 질 수 있습니다. 작은 질문 하나만 : 왜 x.begin ()과 x.end ()를 전달해야합니까? 벡터 x를 전달하기에 충분하지 않습니까?
Giorgio

std::transform두 개의 이터레이터를 사용하므로 컨테이너 한 조각을 사용할 수 있습니다 (반복자 산술이 있음을 기억하십시오).
m0nhawk

따라서 슬라이스를 만들고 변환을 적용하는 두 가지 작업이 하나 있습니다.
Giorgio

이전에는 두 개의 반복자가 있고 그들 사이의 요소에 변형을 적용했습니다. 반복자는 함수형 프로그래밍에서 일반적이지 않습니다.
m0nhawk

2
C ++에서는 반복자 기반 알고리즘이 매우 유용한 라이브러리를 찾지 못했습니다. 귀하의 경우 다음과 std::transform같은 래퍼를 만들 수 있습니다 Y<U> map(T<U>, std::function<Y(U)>).
m0nhawk
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.