나는 이것이 아마도 어리석은 질문이라는 것을 안다. 나는 언제 자신의 반복자를 써야 할까? 내 컨테이너 클래스를 디자인 할 때 뿐인가? 내 자신의 이터레이터를 만들고 싶을 때가 있습니까?이터레이터를 작성해야 할 때?
예제는 충당 될 것이다.
는
나는 이것이 아마도 어리석은 질문이라는 것을 안다. 나는 언제 자신의 반복자를 써야 할까? 내 컨테이너 클래스를 디자인 할 때 뿐인가? 내 자신의 이터레이터를 만들고 싶을 때가 있습니까?이터레이터를 작성해야 할 때?
예제는 충당 될 것이다.
는
-Jon 당신은 당신의 자신의 컨테이너 클래스에 대한 자신의 반복자를 작성해야하거나 비표준 동작을해야하는 경우 표준 컨테이너를 반복 할 때.
클래스 (대부분 컨테이너 일 가능성이 높고 구현 세부 정보가 노출되지 않고 편리하게 사용자를 트래버스 할 수있게하려는 경우 반복기를 만들어야합니다.
이것은 클래스 패밀리 (가장 가능성있는 컨테이너)가 있고 구현이 매우 다른 경우에도 사용자 모두에게 동일한 반복/순회 인터페이스를 제공하려는 경우에 더욱 그렇습니다 (예 : 링크 된 목록 대 배열).
예, 다른 경우가 있습니다. 몇 가지 예 :
새 반복자를 만들고 싶습니다 어디 두 사례를 볼 수 있습니다 자신의 컨테이너 클래스에 대한
every_3rd_iterator
을 원하십니까? 이러한 반복자는 아마도 기존 반복자 주위의 어댑터로 구현 될 것입니다.데이터 시퀀스를 반복 할 필요가있을 때마다 필요에 따라 반복기가 이미 정의되어 있지 않습니다.
종종 반복기를 사용하여 컨테이너를 트래버스하지만, 이는 유일한 용도와는 거리가 있습니다.
이터레이터는 또한 데이터베이스 쿼리 결과를 트래버스하거나 스트림 (std::istream_iterator
및 std::istreambuf_iterator
이미 이미 수행)에서 읽기를 입력하거나 특수한 트래버스 순서 또는 전략이 필요할 수 있습니다. 아마도 "이 벡터의 모든 멤버, 인덱스가 4로 나눌 수있는 모든 멤버"또는 "이 문자열의 모든 대문자"또는 다른 생각할 수있는 항목을 반복 할 수 있습니다.
+1 : 다른 답변을 벗어나는 몇 가지 다른 예 :'boost :: filesystem :: directory_iterator'는 컨테이너가 아니라 디렉토리를 반복합니다. 'pqxx :: result :: iterator'는 질의 결과를 DB로 반복하고,'boost :: asio :: tcp :: resolver :: iterator'는 tcp 끝점을 반복합니다 ... 아무도 정확히 컨테이너가 아닙니다. 그들은 이터레이터 관용구를 사용한다. –
문자열/정규식 검색 등에서 일치합니다. – UncleBens
필터 및 선택 반복기를 제외하고 C++에서 반복기를 작성한 유일한 경우 타사 컨테이너 클래스가 stl 알고리즘으로 훌륭하게 작동하도록하는 것입니다.예를 들어
일반적으로 반복기를 작성하는 것이 어렵 기 때문에 일반적으로 어렵습니다. 처리해야 할 것이 많습니다. 그러나이 작업은 boost 반복자 라이브러리로 훨씬 쉽게 이루어집니다.
또한 피보나치 수 또는 소수와 같은 숫자 시퀀스를 반복하는 데 사용할 수도 있습니다. 이것들은 다른 방법으로, 아마 더 쉽게 할 수 있지만, 반복자를 사용하는 것이 의미있는 일이있을 수 있습니다.
이터레이터를 구현하는 것이 매우 유용 할 수 있으며 매우 자주 수행했습니다. 반복자는 모든 사람들이 사용법을 알고 있다는 단순한 개념입니다. 반복자를 사용하면 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를 배포하는 대신 반복기를 구현할 때 코드가 훨씬 더 간단해질 수 있습니다.
답변에서 말하는 바에 따르면, 모든 사람들이 열렬히 반복자를 작성한다고 생각할 것입니다. 개인적으로 말하자면, 저는 아마 C++ 경력을 두 번했을 것 같습니다. –
답변에서 볼 수 있듯이 맞춤 반복기를 구현하는 것이 의미있는 경우가 있지만 그보다 드문 경우입니다. 컨테이너 클래스가 STL 컨테이너 위에 구축 된 경우 자체 컨테이너를 롤링하기보다는 기본 컨테이너의 반복기를 노출하는 것이 적절할 수 있습니다. –
대부분 사람들은 일부 라이브러리에서 사용할 수있는 반복기를 언급한다고 생각합니다. 예를 들어 http://www.boost.org/doc/libs/1_42_0/libs/iterator/doc/index.html#specialized-adaptors를 확인하십시오. 직접 구현할 필요 없음;) – UncleBens