2013-12-08 4 views
0

나는 종종 begin iterator와 end iterator에 의존하는 std 알고리즘을 사용하고있다. 표준에는 컨테이너를 인수로 사용하는 오버로드가 포함되지 않는 이유는 무엇입니까 (반복기가 아닌). 이와 같은 것을 표준에 포함시키지 않는 기술적 인 이유가 있습니까?STL의 컨테이너 기반 오버로드

template <typename ContainerT, typename ValueT> 
typename ContainerT::iterator find(ContainerT& container, const ValueT& value) 
{ 
    return std::find(begin(container), end(container), value); 
} 

전체 벡터를 검색 할 때 매우 편리합니다. 전체 컨테이너에 대해 반복하지 않으려는 경우에 대비하여 명시 적 반복기 버전이 여전히 필요하다는 것을 알고 있습니다.

std::vector<std::string> v; 
v.push_back("foo"); 
v.push_back("bar"); 

std::find(v.begin(), v.end(), "bar"); 

find(v, "bar"); // much nicer! :) 
+1

결과를 이해하려면 여전히 컨테이너의'end()'함수에 접근 할 필요가 있습니다. 대체로, 이것으로부터 얻을 수있는 것은 거의 없습니다. 라이브러리에는 이미 * 훌륭한 도구 모음이 하나씩 있습니다. 프로젝트에 유용 할 수있는 단축키를 직접 만들 수 있습니다. –

+0

바라건대 언젠가는 가능할 겁니다. 내 말에 "원거리"버전을 계속 사용할 예정입니다 ... –

답변

0

그것은 배열에서 작동하지 않습니다. 예를 들어 :

int myArray* = new int[2354]; 

begin(myArray)end(myArray)는 큰 의미가 없습니다. 그러나 std::find(myArray, myArray + 2354, value)가 작동합니다.

하지만 표준을 사용하면 현재 인터페이스에서 제대로 작동 할 수 있습니다.

게다가, 당신은 항상 우리에게 전체 컨테이너의 알고리즘을 원하지 않습니다.

2 개의 반복자 사이의 간격에서만 작동하므로, 예를 들어 컨테이너 중간까지 무언가에 find()을 사용할 수 있습니다.

+1

포인터를 위해서가 아니라 배열을 위해 완벽하게 작동합니다.게다가 OP는 특히 추가 오버로드가 기존 기능을 대체하고 확장하기를 원하지 않는다고 말했습니다. 물론 이터레이터 버전은 여전히 ​​필요합니다 (추가 오버로드가 필요하거나 유용 할 것이라는 말은 아닙니다. 단지 그 대답이 실제로 그 문제를 다루지 않습니다). –

0

아직 아무도 Boost Range library을 언급 한 것이 놀랍습니다. 당신이 찾고있는 기능을 제공하며, proposals이 STL과 비슷한 것을 추가합니다. ISO C++ 작업 그룹이 범위에 전념 할 수도 있지만 머리 꼭대기를 기억할 수는 없습니다.

또한 Kerrek SB에 동의하지 않는 드문 경우 중 하나입니다. 반복기에서 범위로 추상화 수준을 높이는 것에서 얻는 많은 유틸리티, 특히 알고리즘을 실행하기 전에 범위를 수정하기위한 어댑터 사용이 많습니다. Boost 범위 라이브러리는 왜 이것이 중요한 아이디어인지 설명합니다. 간단한 예를 들어, 지시 대상에 액세스하려는 포인터의 범위를 고려하십시오.

std::vector<int *> v; // populate with something. 

auto begin = boost::make_indirect_iterator(v.begin()); 
auto end = boost::make_indirect_iterator(v.end ()); 

std::for_each(begin, end, do_something); 

우리는 내가 분명히 생각이 훨씬 더 간결하게 표현할 수 범위 알고리즘과 어댑터를 사용 :

boost::range::for_each(v | boost::adaptors::indirected, do_something); 

유일한 반복자와 함께, 당신은 다음과 같은 일을 할 필요가 수행 현재 Boost 구현에서 부족한 것으로 보이는 것은 변환 및 필터링 된 범위 어댑터가 아직 람다 함수와 잘 작동하지 않는다는 것입니다. 내가 코딩하는 방식을 근본적으로 바꾼 라이브러리에 대한 입찰가가 아닙니다.