2010-03-24 2 views
22

나는 이것이 아마도 어리석은 질문이라는 것을 안다. 나는 언제 자신의 반복자를 써야 할까? 내 컨테이너 클래스를 디자인 할 때 뿐인가? 내 자신의 이터레이터를 만들고 싶을 때가 있습니까?이터레이터를 작성해야 할 때?

예제는 충당 될 것이다.

+7

답변에서 말하는 바에 따르면, 모든 사람들이 열렬히 반복자를 작성한다고 생각할 것입니다. 개인적으로 말하자면, 저는 아마 C++ 경력을 두 번했을 것 같습니다. –

+3

답변에서 볼 수 있듯이 맞춤 반복기를 구현하는 것이 의미있는 경우가 있지만 그보다 드문 경우입니다. 컨테이너 클래스가 STL 컨테이너 위에 구축 된 경우 자체 컨테이너를 롤링하기보다는 기본 컨테이너의 반복기를 노출하는 것이 적절할 수 있습니다. –

+1

대부분 사람들은 일부 라이브러리에서 사용할 수있는 반복기를 언급한다고 생각합니다. 예를 들어 http://www.boost.org/doc/libs/1_42_0/libs/iterator/doc/index.html#specialized-adaptors를 확인하십시오. 직접 구현할 필요 없음;) – UncleBens

답변

2

-Jon 당신은 당신의 자신의 컨테이너 클래스에 대한 자신의 반복자를 작성해야하거나 비표준 동작을해야하는 경우 표준 컨테이너를 반복 할 때.

3

클래스 (대부분 컨테이너 일 가능성이 높고 구현 세부 정보가 노출되지 않고 편리하게 사용자를 트래버스 할 수있게하려는 경우 반복기를 만들어야합니다.

이것은 클래스 패밀리 (가장 가능성있는 컨테이너)가 있고 구현이 매우 다른 경우에도 사용자 모두에게 동일한 반복/순회 인터페이스를 제공하려는 경우에 더욱 그렇습니다 (예 : 링크 된 목록 대 배열).

7

예, 다른 경우가 있습니다. 몇 가지 예 :

  1. 컨테이너의 항목 중 필터링 된 하위 집합 만 반환하는 filter_iterator.
  2. 오브젝트의 일부만 리턴하는 선택 반복자.
  3. 항목 대신 또는 항목 사이에 구분 기호를 쓰는 대신 ostream_iterator를 사용합니다.
1

새 반복자를 만들고 싶습니다 어디 두 사례를 볼 수 있습니다 자신의 컨테이너 클래스에 대한

  • 를 (당신이 자신을 지적으로).
  • 기존 컨테이너 클래스에 대한 사용자 정의 동작이있는 반복기. 예를 들어 STL은 backwards iterators입니다. 아마 모든 세 번째 요소 만 반환하는 every_3rd_iterator을 원하십니까? 이러한 반복자는 아마도 기존 반복자 주위의 어댑터로 구현 될 것입니다.
5

데이터 시퀀스를 반복 할 필요가있을 때마다 필요에 따라 반복기가 이미 정의되어 있지 않습니다.

종종 반복기를 사용하여 컨테이너를 트래버스하지만, 이는 유일한 용도와는 거리가 있습니다.

이터레이터는 또한 데이터베이스 쿼리 결과를 트래버스하거나 스트림 (std::istream_iteratorstd::istreambuf_iterator 이미 이미 수행)에서 읽기를 입력하거나 특수한 트래버스 순서 또는 전략이 필요할 수 있습니다. 아마도 "이 벡터의 모든 멤버, 인덱스가 4로 나눌 수있는 모든 멤버"또는 "이 문자열의 모든 대문자"또는 다른 생각할 수있는 항목을 반복 할 수 있습니다.

+2

+1 : 다른 답변을 벗어나는 몇 가지 다른 예 :'boost :: filesystem :: directory_iterator'는 컨테이너가 아니라 디렉토리를 반복합니다. 'pqxx :: result :: iterator'는 질의 결과를 DB로 반복하고,'boost :: asio :: tcp :: resolver :: iterator'는 tcp 끝점을 반복합니다 ... 아무도 정확히 컨테이너가 아닙니다. 그들은 이터레이터 관용구를 사용한다. –

+0

문자열/정규식 검색 등에서 일치합니다. – UncleBens

1

필터 및 선택 반복기를 제외하고 C++에서 반복기를 작성한 유일한 경우 타사 컨테이너 클래스가 stl 알고리즘으로 훌륭하게 작동하도록하는 것입니다.예를 들어

  • CORBA의 시퀀스에 대한 임의 접근 반복자
  • CORBA의 시퀀스에 대한 다시 삽입하여 XML 돔을위한 양방향 반복자는,이 사용하는 저를 활성화 반복자에 DOM 노드를 변환
  • 노드 형제를 foreach하고 변형 시키십시오.

일반적으로 반복기를 작성하는 것이 어렵 기 때문에 일반적으로 어렵습니다. 처리해야 할 것이 많습니다. 그러나이 작업은 boost 반복자 라이브러리로 훨씬 쉽게 이루어집니다.

+1

사실 나는 어제 부스트를 다운로드했습니다. 이제는 내가 별도의 라이브러리를 만들 수 있다면 .. – Jon

+0

안녕하세요 존, 전에도 부스트 라이브러리를 컴파일하는 데 어려움을 겪었습니다. 그러나 일부 라이브러리 만 빌드해야합니다. 대부분 헤더 전용 라이브러리이며 방금 포함 된 빌드 일 필요는 없습니다.iterator 라이브러리는 다음 중 하나입니다. – iain

0

또한 피보나치 수 또는 소수와 같은 숫자 시퀀스를 반복하는 데 사용할 수도 있습니다. 이것들은 다른 방법으로, 아마 더 쉽게 할 수 있지만, 반복자를 사용하는 것이 의미있는 일이있을 수 있습니다.

2

이터레이터를 구현하는 것이 매우 유용 할 수 있으며 매우 자주 수행했습니다. 반복자는 모든 사람들이 사용법을 알고 있다는 단순한 개념입니다. 반복자를 사용하면 STL 알고리즘을 사용할 수 있습니다.

종종, 당신은 같은 자주 사용하는 운영 시스템 API의 사용을 단순화하는 반복자를 구현할 수 있습니다 윈도우 FindNextFile

당신이 file_iterator을 (이미 부스트에 존재) 쓸 때, 당신은 갑자기 수행 할 수 있습니다

file_iterator itBegin; // initialize appropriately 
file_iterator itEnd; 
std::vector<HANDLE> vecFiles(itBegin, itEnd); 

을 사용하여 일치하는 모든 파일에 대한 핸들 목록을 가져옵니다. 반복기가 없으면 필요한 API 호출로 인해 코드를 읽기가 어려워졌습니다.

이터레이터는 당신이 정말로 말하고자하는 것을 쓸 수 있도록 간단한 개념으로 생각하고 핵심적인 세부 사항을 추출합니다. 그 자체만으로는 이해하기 어려운 복잡한 알고리즘을 구현해야하는 경우 코드 혼란을 줄이려합니다.

2 차원 구조 인 경우 std :: vector < std :: vector>, 즉 모든 내부 벡터가 같은 길이를 가져야하는 테이블 인 경우에는 내부 벡터의 n 번째 요소를 반복 할 필요가 있습니다. 이런 일이 자주 발생하면 코드 전체에 중첩 된 for-loops를 배포하는 대신 반복기를 구현할 때 코드가 훨씬 더 간단해질 수 있습니다.

관련 문제