2014-06-09 3 views
0

정수 범위에서 STL 알고리즘을 호출하는 좋은 방법이 있습니까?정수 범위의 알고리즘 사용

예를 들어 GetElement (int) 메서드를 통해서만 요소에 액세스 할 수있는 콜렉션 "col"이 있습니다. find_if 함수를 사용하여 해당 컬렉션에서 무언가를 찾을 수 있습니까?

나는 그런 식으로 뭔가를 호출하고 싶습니다 : 내가 STL 또는 다른 라이브러리 솔루션을 찾고 있어요

auto element = 
     find_if(0, col.Size(), [&col] (int i) { 
      return predicate(col.GetElement(i)); 
     }); 

.

답변

3

표준 C++? 예, 맞춤 요소 반복기를 작성하면 가능합니다. 그런 다음 코드는 쉽게 단순화된다

auto element = find_if(col.begin(), col.end(), predicate); 


그것은 당신이 표준 라이브러리에 생각했던 것과 가까운 무언가를하는 것은 불가능하지만 믿을 C 인, 부스트 함께 ++ 라이브러리 당신을 정말로해야합니다. http://www.boost.org/doc/libs/1_55_0/libs/iterator/doc/counting_iterator.html

이 어떻게 표준 : : 사본을 사용하여 백까지의 숫자 0으로 벡터를 채우는 것() : 부스트는 계산 반복자있다? 내장 정수 형식에서 누락 된 유일한 반복자 연산은 정수의 현재 값을 반환하는 연산자 *()입니다. 카운팅 반복자 어댑터는 랩핑하는 모든 유형에이 중요한 기능을 추가합니다. 정수형뿐만 아니라 증분 형을 가진 계수 반복자 어댑터를 사용할 수 있습니다.

#include <boost\counting_iterator.hpp> //or something, not sure of exact header 

int main() { 
    boost::counting_iterator<int> first(0); 
    boost::counting_iterator<int> last(col.Size()); 
    auto element = find_if(first, last, [&col](int i) {return predicate(col.GetElement(i);}); 
} 

또한, 부스트도 범위를 가지고있다. 그들은 정말이 정확한 상황에서 많은 도움이되지 않습니다, 그러나 그것은 관련, 그래서 나는 그것을 언급합니다 :

#include <boost\range\irange.hpp> 

int main() { 
    for (int index: boost::range::irange<int>(0, col.Size())) 
    { 
     std::cout << element; //counts from 0 to col.Size() 
    } 
} 
+0

당신이 반복자를 구현하는 경우는 어떻습니까? – 4pie0

+0

물론,'boost :: counting_iterator'를 직접 재 작성 할 수는 있습니다 만, 왜 그렇게할까요? –

+0

채팅 (채팅에서 계속 토론) (영문) (http://chat.stackoverflow.com/rooms/55345/discussion-between-mooing-duck-and-bits-international). –