루프를 수정하면서 반복을 반복하는 것은 일반적으로 까다 롭습니다. 소거 제거 관용구 :
따라서 비 연관 시퀀스 가능한 관용구 ++ 특정 C가있다.
IT는 erase
방법의 범위 과부하와 remove_if
알고리즘의 사용을 결합 :
술어 어느 전형적인 펑 객체 또는 새로운 C++ 11 람다 구문을 사용하여 표현된다
myQueue.erase(
std::remove_if(myQueue.begin(), myQueue.end(), /* predicate */),
myQueue.end());
.
// Functor
struct OddKey {
bool operator()(std::pair<int, int> const& p) const {
return p.first % 2 != 0;
}
};
/* predicate */ = OddKey()
// Lambda
/* predicate */ = [](std::pair<int, int> const& p) { return p.first % 2 != 0; }
람다 형식은 더 간결하지만 덜 문서화 될 수 있으며 (이름 없음) C++ 11에서만 사용할 수 있습니다. 당신의 취향과 제약에 따라, 가장 적합한 것을 골라주십시오.
코드 작성 방법을 향상시킬 수 있습니다 : Boost.Range을 사용하십시오.
typedef std::vector< std::pair<int, int> > PairVector;
void pass(PairVector& pv) {
auto const filter = [](std::pair<int, int> const& p) {
return p.first % 2 != 0;
};
auto const transformer = [](std::pair<int, int> const& p) {
return std::make_pair(p.first, p.second/2);
};
pv.erase(
boost::transform(pv | boost::adaptors::filtered(filter),
std::back_inserter(pv),
transformer),
pv.end()
);
}
당신은 많은 다른 사람들과 함께 transform
및 설명서의 filtered
adaptor을 찾을 수 있습니다.
그리고 질문은 ...? – ScarletAmaranth
질문은 이해하기 어렵습니다. 너는 그것을 바꿔 줄 수 있니? – juanchopanza
질문에 물음표가 누락되었습니다. 마지막 줄. – Nick