logo

C++ STL의 반복자

안  C++의 반복자  STL 컨테이너의 요소를 가리키는 포인터 같은 개체입니다. 일반적으로 C++에서 STL 컨테이너의 내용을 반복하는 데 사용됩니다. STL 반복자의 주요 장점은 사용되는 컨테이너 유형과 관계없이 STL 알고리즘을 독립적으로 만든다는 것입니다. STL 알고리즘에 컨테이너 자체를 전달하는 대신 컨테이너 요소에 반복자를 전달할 수 있습니다.

반복자 선언

C++ STL의 각 컨테이너에는 자체 반복자가 있습니다. 따라서 반복자를 다음과 같이 선언해야 합니다.



C++
<type>::iterator it; 

어디

  • 유형: 반복자가 선언된 컨테이너 유형입니다.
  • 그것: 반복자 개체에 할당된 이름입니다.

그런 다음 유효한 반복자를 할당하여 초기화할 수 있습니다. 선언 시 할당할 반복자가 이미 있는 경우 다음을 사용하여 유형 선언을 건너뛸 수 있습니다. 자동 예어.

C++
auto it = iter 

어디 새로 생성된 it 반복자에 할당된 반복자입니다.



우리의 C++ 코스 다양한 컨테이너 유형을 탐색하는 방법을 이해할 수 있도록 STL의 반복기 사용을 다룹니다.

아래 프로그램은 반복자를 사용하여 벡터 컨테이너를 탐색하는 방법을 보여줍니다.

C++
#include    using namespace std; int main() {  vector<int> v = {1 2 3 4 5};  // Defining an iterator pointing to  // the beginning of the vector  vector<int>::iterator first =  v.begin();  // Defining an iterator pointing  // to the end of the vector  vector<int>::iterator last =  v.end();    // Iterating the whole vector  while(first != last) {  cout << *first << ' ';  first++;  }  return 0; } 

산출
1 2 3 4 5 

당신도 알 수 있듯이 우리는 벡터::시작() 및 벡터::끝() 기능. 이러한 함수는 벡터의 첫 번째 요소와 마지막 요소 다음의 한 요소에 대한 반복자를 반환하는 std::Vector의 멤버 함수입니다. 벡터를 반복하기 위해 반복자 반환 함수를 사용합니다.



컨테이너 반복자 함수

C++ STL은 다음에서 일부 멤버 함수를 제공합니다. 최소한 첫 번째 요소와 마지막 요소에 대한 반복자를 반환합니다. 이러한 멤버 함수는 거의 모든 STL 컨테이너에 정의되어 있습니다. 스택 대기줄 ) 일관성을 위해 동일한 이름을 사용합니다.

다음 표에는 반복자를 컨테이너에 반환하는 모든 메서드가 나열되어 있습니다.

시작하다()

컨테이너의 시작 부분에 반복자를 반환합니다.

끝()

컨테이너의 마지막 요소 바로 뒤의 이론적인 요소에 대한 반복자를 반환합니다.

컨테이너의 시작 부분에 상수 반복자를 반환합니다. 상수 반복자는 자신이 가리키는 요소의 값을 수정할 수 없습니다.

정규식 자바 란 무엇입니까?

컨테이너의 마지막 요소 바로 뒤의 이론적인 요소에 상수 반복자를 반환합니다.

컨테이너의 시작 부분에 대한 역방향 반복자를 반환합니다.

세우다()

컨테이너의 마지막 요소 바로 뒤의 이론적인 요소에 역방향 반복기를 반환합니다.

컨테이너의 시작 부분에 상수 역방향 반복자를 반환합니다.

컨테이너의 마지막 요소 바로 뒤의 이론적인 요소에 상수 역방향 반복자를 반환합니다.

벡터의 이름이면 아래와 같이 위의 방법을 사용할 수 있습니다.

C++
vec.begin() vec.rbegin() vec.cbegin() vec.crbegin() vec.end() vec.rend()  vec.cend() vec.crend() 

포인터 산술과 마찬가지로 C++ 반복자에서 허용되는 몇 가지 작업이 있습니다. 반복자의 중요성을 높이는 다양한 기능을 제공하는 데 사용됩니다. There are 5 valid C++의 반복자 연산 :

  • 증가/감소 반복자
  • 반복자에 정수 더하기/빼기
  • 다른 반복자 빼기
  • 반복자 비교

반복자 역참조

역참조 작업을 통해 사용자는 다음을 수행할 수 있습니다. 반복자가 가리키는 요소의 값입니다. 우리는 (*) 간접 연산자 포인터처럼 반복자를 역참조합니다.

C++
// Access *it; // Update *it = new_val;  

어디 new_val 반복자가 가리키는 요소에 할당된 새 값입니다. 그것 .

증가/감소 반복자

다음을 사용하여 반복자를 1씩 늘리거나 줄일 수 있습니다. (++) 또는 (--) 연산자 각기. 증분 연산은 반복자를 컨테이너의 다음 요소로 이동하고 감소 연산은 반복자를 이전 요소로 이동합니다.

C++
it++; // post-increment ++it; // pre-increment it--; // post-decrement --it; // pre-decrement 

반복자에 정수 더하기/빼기

반복자에서 정수 값을 더하거나 뺄 수도 있습니다. 추가된 정수 값에 따라 다음 또는 이전 위치에 반복자가 더 많아집니다.

C++
// Addition it + int_val;  // Subtraction it - int_val;  

어디 int_val 반복자에서 더하거나 빼는 정수 값입니다. 그것 .

다른 반복자 빼기

하나의 반복자에서 다른 반복자를 빼서 그들이 가리키는 메모리 사이의 거리(또는 요소 수)를 찾을 수 있습니다.

C++
it1 - it2 

반복자 비교

또한 동일한 유형의 두 반복자를 서로 테스트하여 둘 사이의 관계를 찾을 수도 있습니다. (==) 같음 및 (!=) 같지 않음 연산자와 같은 관계 연산자를 다음과 같은 다른 관계 연산자와 함께 사용할 수 있습니다.< > <= >=.

C++
it1 != it2 // Equal to it1 == it2 // Not equal to it1 > it2 // Greater than it1 < it2 // Less than it1 >= it2 // Greater than equal to it1 <= it2 // Less than equal to 

C++의 반복기 유형

STL 반복자는 수행할 수 있는 작업을 기준으로 나눌 수 있습니다. C++에는 지원되는 컨테이너 및 지원되는 반복기 작업과 함께 아래 표에 나열된 5가지 주요 반복기 유형이 있습니다.

반복자

설명

지원되는 컨테이너

지원되는 작업

입력 반복자

값을 읽는 데 사용되는 단방향 반복자입니다.

입력 스트림

역참조 증분 평등

출력 반복자

It is also a one-way iterator but used to assign the values. 값에 액세스할 수 없습니다.

출력 스트림

역참조(쓰기 전용) 증분

순방향 반복자

값에 액세스하고 할당할 수 있습니다. 입력 및 출력 반복자의 조합입니다.

앞으로_목록 unordered_map unordered_set

역참조 증분 평등

양방향 반복자

앞으로 또는 뒤로 양방향으로 움직일 수 있습니다. 목록 세트 및 다중 맵과 같은 컨테이너는 양방향 반복자를 지원합니다.

목록 맵 세트 다중 맵 다중 세트

역참조 증가/감소 동일성

무작위 액세스 반복자

무작위 액세스 반복자는 포인터와 동일한 기능을 제공하기 위해 가리키는 요소에서 멀리 떨어진 요소에 액세스하는 데 사용할 수 있는 반복자입니다.

벡터 데크 배열 문자열

모니터 크기 찾는 방법

모두

입력 및 출력 반복자와 별도로 위의 표에서 알 수 있듯이

반복자 어댑터

반복자 어댑터 유형

설명

역방향 반복자

스트림 반복자

반복자 이동

이동 반복자는 STL 알고리즘에 이동 의미를 도입하는 데 사용됩니다. 이동 반복기는 추가 복사본을 만들지 않고 복사된 컨테이너 데이터의 소유권을 복사 컨테이너로 이동합니다.

삽입자 반복자

The insertor iterators allows you to insert the given elements at some position in the container. C++에는 세 가지 삽입기 반복자가 있습니다.

  1. back_insert_iterator: 용기 뒷면에 삽입합니다.
  2. 앞_삽입_반복자: 용기 앞쪽에 삽입합니다.
  3. insert_iterator: 컨테이너의 어느 위치에나 삽입됩니다.

이러한 반복자는 다음을 사용하여 만들 수 있습니다. 뒤로 삽입기() 앞_삽입기() 끼워 넣다() C++의 함수.

C++의 반복자 유틸리티 함수

C++ STL provide the various function to simplify the working with iterators. 아래 표에 나열되어 있습니다.

기능 설명 통사론
표준::고급 특정 위치 수만큼 반복기를 전진시킵니다. 전진 ( 그것 n )
표준::다음 다음 ( 그것 n )
표준 :: 이전 이전 ( 그것 n )
표준::거리 거리 ( 그것1 그것2 )
표준::시작 시작하다 ( 컨테이너 )
표준::끝 ( 컨테이너 )
표준::rbegin rbegin ( 컨테이너 )
표준::렌드 만든다 ( 컨테이너 )
표준::삽입기 컨테이너의 지정된 위치에 요소를 삽입하는 삽입 반복기를 만듭니다. 삽입기 ( 컨테이너 위치 )
표준::back_inserter 컨테이너 끝에 요소를 추가하는 후면 삽입 반복기를 만듭니다. 뒤로_삽입기 ( 컨테이너 )
표준::front_inserter 컨테이너 앞에 요소를 삽입하는 전면 삽입 반복기를 만듭니다. 앞_삽입기 ( 컨테이너 )

예제와 함께 반복자의 응용

반복자는 STL 컨테이너 및 알고리즘으로 작업하는 동안 다양한 목적으로 C++에서 광범위하게 사용됩니다. 다음은 코드 예제와 같은 C++ 반복자의 몇 가지 기본 응용 프로그램입니다.

컨테이너 횡단

STL 컨테이너를 순회하는 것은 반복자의 가장 기본적인 응용 프로그램입니다. 여기서는 start() 및 end() 함수를 사용하여 전체 컨테이너를 순회하는 시작 및 끝 반복자를 가져옵니다. 기본적으로 우리는 시작 반복자가 끝과 같지 않을 때까지 계속 증가시킵니다.

C++
#include    using namespace std; int main() {  set<int> s = {10 20 30   40 50};  // Iterator to the beginning   // of the set  auto it = s.begin();  // Iterating through the   // entire set  while (it != s.end()) {    // Dereferencing iterator   // to access value  cout << *it << ' ';    // Incrementing the   // iterator  it++;  }    return 0; } 

산출
10 20 30 40 50 

위의 코드에서 볼 수 있듯이 세트 컨테이너를 탐색합니다. 마찬가지로 동일한 접근 방식을 사용하여 모든 컨테이너를 탐색할 수 있습니다.

컨테이너 뒤집기

역방향 반복자를 사용하면 역방향을 수동으로 처리할 필요 없이 컨테이너를 끝에서 처음으로 순회할 수 있습니다.

C++
#include    using namespace std; int main() {  vector<int> vec = {10 20 30   40 50};  // Defining reverse iterators   // pointing to the reverse   // beginning of vec  auto it = vec.rbegin();  // Iterating the whole   // vector in reverse  while (it != vec.rend()) {  cout << *it << ' ';  it++;  }  return 0; } 

산출
50 40 30 20 10 

컨테이너 독립적인 알고리즘

반복자를 사용하면 알고리즘이 std::sort() std::find() 및 std::for_each()와 같은 함수를 보다 유연하게 만드는 모든 컨테이너 유형과 작동할 수 있습니다. 실제 컨테이너 대신 반복자를 전달할 수 있습니다.

C++
#include    using namespace std; int main() {  vector<int> vec = {30 10 40   10 50};  multiset<int> ms = {10 30 10   20 40 10};  // Using the std::count() algorithm to count  // the number of occurences of 10 in vector  // and multiset using iterator  cout << '10s in Vector: '   << count(vec.begin()  vec.end() 10) << endl;  cout << '10s in Multiset: '   << count(ms.begin()  ms.end() 10);  return 0; } 

산출
10s in Vector: 2 10s in Multiset: 3

반복자의 추가 응용 프로그램

STL 반복자의 더 많은 응용 프로그램이 있습니다:

  • 거리 계산: std::distance() 반복자를 사용하면 컨테이너의 두 위치 사이의 요소 수를 계산하는 데 도움이 됩니다.
  • 스트림 반복: 스트림 반복기를 사용하면 입력/출력 스트림을 컨테이너처럼 처리할 수 있으므로 STL 알고리즘을 사용하여 스트림을 더 쉽게 읽고 쓸 수 있습니다.
  • STL 알고리즘의 의미 이동: 이동 반복기는 불필요한 복사를 방지하여 성능과 효율성을 높이는 데 도움이 되는 STL 알고리즘의 이동 의미 체계를 도입합니다. 데이터는 이동 의미 규칙에 따라 이동됩니다.
  • 데이터 구조를 위한 사용자 정의 반복자: STL 알고리즘 및 기타 여러 기능에 대한 지원을 제공하기 위해 트리 또는 그래프와 같은 STL이 아닌 데이터 구조에 대해 사용자 정의 반복기를 구현할 수 있습니다. 적절한 증가 감소 및 기타 작업을 제공하려면 몇 가지 규칙과 규칙을 따라야 할 수도 있습니다.