... 범위를 전달하는 옵션을 갖는 것이 확실히 유용합니다. 그러나 적어도 내 경험상, 이것은 드문 특별한 경우입니다. 나는 보통 전체 컨테이너에서 작동하고 싶습니다
경험상 드문 특별한 경우 일 수 있지만 실제로 전체 컨테이너 는 특별한 경우이며 임의의 범위 는 일반적인 경우입니다.
현재 인터페이스를 사용하여 전체 컨테이너 사례를 구현할 수 있지만 대화를 수행 할 수는 없습니다.
따라서 라이브러리 작성자는 두 개의 인터페이스를 미리 구현하거나 모든 경우를 다루는 인터페이스 만 구현할 수 있습니다.
컨테이너를 가져 와서 begin () 및 end ()를 호출하는 래퍼 함수를 작성하는 것은 쉽지만 이러한 편리한 함수는 표준 라이브러리에 포함되어 있지 않습니다.
특히 무료로 기능하기 때문에, 사실 std::begin
과 std::end
지금 포함되어 있습니다.
따라서 라이브러리가 편리한 과부하를 제공한다고 가정 해 봅시다.
template <typename Container>
void sort(Container &c) {
sort(begin(c), end(c));
}
이제 비교 functor를 사용하는 동등한 과부하를 제공해야하며 다른 모든 알고리즘에 해당하는 과부하를 제공해야합니다.
그러나 최소한 컨테이너가 가득한 상태에서 작업하고 싶은 모든 경우를 다루었습니다. 글쎄요 치다
std::for_each(c.rbegin(), c.rend(), foo);
컨테이너에서 거꾸로 작업을 처리 하려면 기존 알고리즘마다 다른 방법 (또는 방법 쌍)이 필요 합니다.
따라서 범위 기반 접근 방식은 다음과 같은 단순한 의미에서 더 일반적입니다.
- 전체 컨테이너 버전이 할 수있는 모든 것을 할 수 있습니다
- 전체 컨테이너 접근 방식은 필요한 과부하 수를 두 배 또는 세 배로 늘리는 동시에 여전히 덜 강력합니다.
- 범위 기반 알고리즘도 작성 가능합니다 (이터레이터 어댑터를 스택 또는 체인으로 연결할 수 있지만 기능 언어 및 Python에서 더 일반적으로 수행됨)
다른 유효한 이유는 것을 어느 물론, 거기에 이미 STL과의 표준화를 얻을 수있는 많은 일이, 그리고 광범위하게 제한위원회 시간을 잘 사용되지 않을 것 사용 된 이전 편의 래퍼로 팽창. 관심이 있으시면 Stepanov & Lee의 기술 보고서를 여기 에서 찾을 수 있습니다.
의견에서 언급했듯이 Boost.Range 는 표준을 변경하지 않고도 새로운 접근 방식을 제공합니다.