벡터의 모든 요소에 논리 조건을 적용하는 while 루프가 있어야합니다. (3 모든 요소! =)전체 벡터에 조건 적용
I 생각할 수있는 유일한 방법은 물품
예컨대, 동안 (모든 요소 < 3) 동안이다 (벡터 [1]! = 3 || 벡터 [2- 반면 ]! = 3 || ...). 내 벡터가 크면 빨리 커질 것입니다.
C++에서 더 좋은 방법이 있습니까?
벡터의 모든 요소에 논리 조건을 적용하는 while 루프가 있어야합니다. (3 모든 요소! =)전체 벡터에 조건 적용
I 생각할 수있는 유일한 방법은 물품
예컨대, 동안 (모든 요소 < 3) 동안이다 (벡터 [1]! = 3 || 벡터 [2- 반면 ]! = 3 || ...). 내 벡터가 크면 빨리 커질 것입니다.
C++에서 더 좋은 방법이 있습니까?
는
std::all_of
는 가정 참조
std::vector<int> v;
if(std::all_of(v.cbegin(), v.cend(), [](int i){ return i < 3 }))
{
}
if(std::all_of(v.cbegin(), v.cend(), [](int i){ return i != 3 }))
{
}
사전 C++ (11) C++ 11에서
struct Check
{
int d;
Check(int n) : d(n) {}
bool operator()(int n) const
{ return n < d; }
};
// Copied from above link
template< class InputIt, class UnaryPredicate >
bool all_of(InputIt first, InputIt last, UnaryPredicate p)
{
for (; first != last; ++first) {
if (!p(*first)) {
return false;
}
}
return true ;
}
if(all_of(v.begin(), v.end(), Check(3)))
{
}
감사! 전 C++ 11을 요청할 것입니다. – holianoify
작동하지 않습니다 ... all_of가 C++ 인 것처럼 보입니다 – holianoify
@holianoify & Galik은 미안하다고 생각하지 않았습니다. 템플릿 구현본을 복사했습니다. – P0W
, 대답은 본질적으로 함께 std::all
을 사용하고 있습니다 람다 :
if (std :: all (v.begin(), v.end(), [] (const typename std :: decay :: type &) {return a < 3; }) * /} C++ 03에서
, 당신은 운동 표준 : 모든과 람다에있는 {7 * 여기에 당신의 재료 :
template<class Iter, Fn>
bool all(Iter i, Iter end, Fn fn)
{
for(;i!=end; ++i)
if(!fn(*i)) return false;
return true;
}
및 <3
당신 같은 명시 적으로 클래스가 필요
class is_less_than_val
{
int val;
public:
is_less_than(int value) :val(value) {}
bool operator()(int var) const { return var<val; }
};
당신이 쓸 수 있도록
if(all(v.begin(),v.end(),is_less_than_val(3))
{ /* your stuff here */ }
이 경우 당신이 모호한 모든 functinal 기계 찾을 수 (C++ 03을하지 실질적인 형태 추론이없는 "쉬운"고), 그리고 좀 더 절차 적 접근 방식을 선호
모든 샘플에서template<class Cont, class Val>
bool all_less_than(const Cont& c, const Val& v)
{
for(typename Cont::const_iterator i=c.cbegin(), i!=c.end(); ++i)
if(!(*i < v)) return false;
return true;
}
template<class Cont, class Val>
bool all_equal_to(const Cont& c, const Val& v)
{
for(typename Cont::const_iterator i=c.cbegin(), i!=c.end(); ++i)
if(!(*i == v)) return false;
return true;
}
, 코드가 배열 되더라도, 모든 것은 검색된 조건의 부정에 대해 거짓으로 깨는 루프로 귀결됩니다.
물론, 모든 수치 비교하면, !(<)
이 >=
하고 !(==)
는 !=
이지만, 계속하고 발은 <를 사용하여 템플릿 매개 변수, 그리고 == 결과는 발 구현을위한 작은 요구 사항 (해당 될 수 있습니다 아무것도하지 않기 때문에 그냥 int
)
다른 사람들처럼 C++ 11에는 에 대한 특수 기능이 있습니다. 사전 C++ 11에서는 일반적인 관용구는 std::find_if
하고 결과에 대한 최종 반복자과의 비교를 포함했을 예 :
struct Condition
{
// The condition here must be inversed, since we're looking for elements
// which don't meet it.
bool operator()(int value) const { return !(value < 3); }
};
// ...
while (std::find_if(v.begin(), v.end(), Condition()) == v.end()) {
// ...
}
이 내가 그것을 계속 사용하는 등 일반적인 관용구이다 C++ 11 (종종 람다가 있지만).
이 검사를 자주 수행하는 경우 벡터 정렬을 항상 유지하거나 벡터의 최대 요소를 추적하는 것과 같은 몇 가지 대안을 살펴볼 수 있습니다. 그러면 O (N) 대신이 체크 O (1)이됩니다. –