2014-10-23 2 views
0

함수형 프로그래밍을 사용하여 코드를 더 잘 작성하고 싶습니다만 전문가는 아닙니다.함수형 프로그래밍을 사용한 선택 생존 수 계산

std::vector<Item*>* collection; 

내가 항목에 선택을 적용해야합니다

나는 항목에 대한 포인터의 컬렉션이 있습니다. 선택은 여러 단계로 구성되어, 모두가 함수 내에서 코딩 :

bool pass_step0(const Item& item); 

를 내가 선택을 생존 얼마나 많은 요소 알아야 할 모든 단계를 들면. 모든 단계의 and을 통과하면 하나의 요소가 선택에서 생존합니다. 그래서 내가이 코드에서 많은 반복이 나는 글로벌 인덱스 i를 사용할 필요가

std::vector<int> nsurvivals_after_step; 
std::vector<bool> mask(collection->size(), true); 

int i = 0; 
for (item : *collection) { 
    if (not(pass_step0(*item)) { mask[i] = false; } 
    ++i; 
} 
nsurvivals.append(count(mask.begin(), mask.end(), true)); 

i = 0; 
for (item : *collection) { 
    if (not(pass_step1(*item)) { mask[i] = false; } 
    ++i; 
} 
nsurvivals.append(count(mask.begin(), mask.end(), true)); 

뭐하는 거지입니다. 그것을 개선하기 위해보다 정교한 C++ 기능을 사용하는 방법?

+1

내가 코드 어디에도 볼 수없는 추가 ': 여러 단계를 통과 할 경우 또한, 당신은 단지 파이프를 계속 할 수 & ='. 실제 목표는 무엇입니까?'& ='또는 제공 한 코드 중 무엇을 사용하여 성취하려고합니까? –

답변

1

이 조금 더 나은 : 그것은 내가 std::transform을 사용하고있는 방법은 확인

std::vector<int> nsurvivals_after_step; 
std::vector<bool> mask(collection->size(), true); 

std::transform(collection->begin(), collection->end(), mask.begin(), mask.begin(), 
       [](Item* i, bool m) { return m and pass_step0(*i); } 
nsurvivals.append(count(mask.begin(), mask.end(), true)); 

std::transform(collection->begin(), collection->end(), mask.begin(), mask.begin(), 
       [](Item* i, bool m) { return m and pass_step1(*i); } 
nsurvivals.append(count(mask.begin(), mask.end(), true)); 

입니까? 세 번째와 네 번째 인수는 동일합니다!

+0

'std :: transform'을 사용한다면'UnaryOperation' 버전을 원할 것입니다 ... 바이너리 op는'm && pass_step0'을하고 있지만'm'은 항상 true입니다. '그것이 초기화 된 것이기 때문입니다. 단지 여분의 코드 일뿐입니다. 또한'and'를 사용하지 말고'&&'를 사용하십시오. – Barry

+0

아니요, 'm'은 첫 번째 '변환'에만 항상 true입니다. 왜 내가'와'를 사용하지 말아야 하는가? –

1

컬렉션에서 필터를 통과하는 항목의 수를 계산하고 싶습니까?

using namespace boost::adaptors; 

const Item& to_ref(const Item* item) { return *item; } 

nsurvivals.push_back(size(*collection 
          | transformed(to_ref) 
          | filtered(pass_step0))); 
nsurvivals.push_back(size(*collection 
          | transformed(to_ref) 
          | filtered(pass_step1))); 

그것은 아마 얻을만큼 깨끗 : 당신은 부스트의 range adaptors 확인 할 수있다.

int passBoth = size(*collection 
        | transformed(to_ref) 
        | filtered(pass_step0) 
        | filtered(pass_step1)); 

[업데이트] * 기능이 분명히 언급을 패스는, 그래서 transformed

관련 문제