은이 질문은이 질문을 제기하는 another topic에서 영감이다. 일반적인 C++ 03 솔루션은 전용 함수 (또는 펑터)를 정의하고이를 세 번째 인수로 std::find_if
에 전달합니다.어떻게하면 몇 가지 부스트 라이브러리를 사용하여 std :: find_if와 std :: map을 함께 사용할 수 있습니까?</p> <blockquote> <p>여러 가지 방법으로 해결 될 수있는지도 컨테이너</p> </blockquote> <p>에서 사용자가 지정한 값보다 첫 번째 큰 값을 찾기 :
는 C++ 11 번이 전용 기능 (또는 펑)을 형성 피할 수 있고, 대신 등 lambda
사용 할 수있다 the accepted answer
auto it = std:: find_if(m.begin(), mp.end(),
[n](const std::pair<std::string, int> & x) -> bool
{ return x.second > n; }
);
한다.
저는 아직 짧고 멋진 해결책을 찾고 있습니다. 이 벡터 인 경우, 다음 그냥 Boost.Phoenix
의 사용을하고 솔루션은 매우 간결하게 멋진 솔루션 (ideone demo) 학습 :
std::vector<int> v = ...;
auto it = std::find_if(v.begin(), v.end(), arg1 > 4);
다음
arg1
boost::phoenix::arg_names
네임 스페이스에 정의 된 펑터 객체이며, 식을 arg1>4
다른 functor를 평가 한 후 std::find_if
으로 전달됩니다.
빠른 테스트는 (ideone),
std::cout<< (arg1 > 9)(v) << std::endl; //prints 0 if as v > 9 is false, else 1
//or store the functor first and then use it
const auto & f = arg1 > 9;
std::cout<< f(v) << std::endl; //prints 0 if as v > 9 is false, else 1
내 질문은
, 나는 비슷한 방법으로,지도 문제를 해결하는 것도 중요합니다. 그런 해결책이 있습니까? 같은 뭔가 :
auto it = std::find_if(m.begin(),mp.end(), (???).second > n); //m is std::map
또는
auto it = std::find_if(m.begin(),mp.end(), at<1>(arg1) > n); //m is std::map
가 작동하는 경우, 표현 at<1>(arg1) > 2
는 인수로 const std::pair &
소요 펑터로 평가한다. 나의 위장 감각은 부스트가이 해결책을 가지고있다라고 나에게 이야기한다. :-)
당신은 값을 (찾을 하시겠습니까 경우에 http : // www.boost.org/doc/libs/release/libs/range/doc/html/range/reference/adaptors/reference/map_values.html이 답)이거나 값 전체가 술어를 만족시키는 값 쌍 전체에 대한 반복자 ? – Cubbi
@Cubbi :지도의 반복자를 반환하는'std :: find_if'와 함께 작동하지 않으면 대답이 아닙니다. – Nawaz
@ Nawaz : std :: find_if가 필요한지 모르겠습니다. 그렇지 않다면, 나는 http://www.cplusplus.com/reference/stl/map/upper_bound/로 가야한다.이 코드는 더 빨라야하며 코드는 단 한 줄 밖에 없다. –