C++교체 기 소개(iterator,constiterator、reverse_interator、const_reverse_interator)

개념:C++의 메커니즘 으로 표준 템 플 릿 라 이브 러 리 의 요 소 를 옮 겨 다 니 는'스마트'포인터 입 니 다.
1.교체 기의 특징
4.567917.교체 기 는 스마트 포인터 로 복잡 한 데이터 구 조 를 옮 겨 다 니 는 능력 을 가진다.
4.567917.용기 마다 내부 구조 가 다 르 기 때문에 같은 교체 기 유형 이 있 습 니 다4.567917.교체 기 정의 후 특정한 인 스 턴 스 용기 대상 에 속 하지 않 습 니 다.이 교체 기 유형 에 속 하 는 용기 유형 이 라면 모두 사용 할 수 있 습 니 다교체 기의 분류
C++의 STL 은 5 가지 교체 기 를 정의 합 니 다.
4.567917.입력 교체 기:가리 키 는 요소 에 대한 읽 기 전용 작업 과 전++후+연산 자 를 제공 합 니 다출력 교체 기:지향 요소 에 대한 쓰기 동작 과+연산 자 를 제공 합 니 다4.567917.앞으로 교체 기:+연산 자 가 있 습 니 다4.567917.양 방향 교체 기:+연산 자 도 있 고--연산 자 도 있 습 니 다4.567917.랜 덤 액세스 교체 기:일반적인 교체 기 로 랜 덤 으로 점프 점프 를 실현 할 수도 있 고 포인터 산술 연산 을 통 해 점프 이동 을 실현 할 수도 있다.
2.교체 기의 사용
1.원리:교체 기 정의 후 지정 한 유형의 용기 안의 요 소 를 가리 키 며 용기 안의 요 소 를 방문 하 는 능력 을 달성 할 수 있 습 니 다.
2.용법
  • 키워드 interator 대표 성명 교체 기,앞 에 유형 을 밝 혀 야 합 니 다
  • 4.567917.교체 기 는 용기 의 특정한 위 치 를 가리킨다4.567917.*인용 을 통 해 요소 의 인용 을 얻 을 수 있 습 니 다(주:*요소 의 인용 을 얻 을 수 있 습 니 다).사용 가능->이 요 소 를 얻 은 멤버(아래 코드 는 소개 합 니 다)
    
    string s= "HelloWorld";
    string::iterator i; //  string      
    for (i = s.begin(); i != s.end(); i++)
    {
      cout << *i;
    }
    3.인용 과 구성원 접근 풀기
    메모:구성원 을 방문 할 때 교체 기 에()를 추가 해 야 합 니 다.그렇지 않 으 면 의미 가 다 릅 니 다.
    
    (*item).empty(); //    
    *item.empty; //    
     위의 코드 중:첫 번 째 줄 은 인용 교체 기 를 푸 는 것 입 니 다.두 번 째 는 아 이 템 에 있 는 empty 멤버 에 게 접근 하려 고 했 지만 아 이 템 은 교체 기 입 니 다.오류 가 발생 했 습 니 다.
    3.interator,constiterator 
    1.교체 기의 핵심 키워드
    용기 의 내부 구성원 에 속 하 며,역할 영역 을 통 해 한정 문자:접근
    2.분류
  • interator:우리 가 용기 요 소 를 수정,삭제 등 작업 을 해 야 할 때 또는 대상 이 비상 량 일 때 사용 합 니 다
  • const_iterator:용기 요 소 를 옮 겨 다 닐 뿐 용기 요 소 를 바 꾸 지 않 을 때 나 대상 이 상수 일 때 사용 합 니 다
  • 주의:위 에서 말 한 상수 란 상수 용기 이지 용기 안의 요소 가 상수 가 아 닙 니 다.
    3.둘 의 선택
    Point Advice:만약 우리 가 용기 요소 나 대상 을 간단하게 옮 겨 다 닐 때 보통 const 를 사용 합 니 다.iterator 가 적당 합 니 다.
    4.C++11 기준:cbgin(),cend()
    C++11 은 두 개의 새로운 함 수 를 도 입 했 는데 각각 cbgin(),cend()이 고 이들 의 기능 은 begin(),end()와 유사 하 다.
    C++11 표준 전,iterator 와 constiterator 는 모두 begin(),end()두 개의 보조 함 수 를 사용 하여 용 기 를 옮 겨 다 닙 니 다.
    C++11 기준 이후 constiterator 는 begin(),end()도 사용 할 수 있 고 cbeg(),cend()도 사용 할 수 있 습 니 다.하지만 iterator 는 begin(),end()만 사용 할 수 있 습 니 다.
    
    vector<int> v;
    const vector<int> v2;
    auto it1=v.begin(); //v1 vector<int>::iterator  
    auto it2=v2.cbegin();//v2 vector<int>::const_iterator  
    4.reverseinterator、const_reverse_interator
    1.개념
    표준 템 플 릿 라 이브 러 리 의 역순 교체 기
    기능 과 interator,constiterator 는 모두 같 지만 용법 은 다르다.
    2.둘 의 차이
  • reverse_interator:interator 와 마찬가지 로 용기 내부 요 소 를 바 꿀 때 사용 합 니 다.rbegin(),rend()만 사용 할 수 있 습 니 다
  • const_reverse_interator:constiterator 와 마찬가지 로 용기 내부 요 소 를 단순히 옮 겨 다 닐 때 만 사용 합 니 다.rbegin(),rend(),crbegin(),crend()를 사용 할 수 있 습 니 다.
    3.용법
    용법 의 원리 와 interator,constiterator 는 같 습 니 다.
    그러나 rbegin(),rend()는 용기 요소 의 마지막 위치 와 첫 번 째 요소 의 앞 위 치 를 가리킨다.
    
    //for      3、2、1
     
    vector<int> v;
    vector<int>::const_reverse_iterator iter;
    v.push_back(1);
    v.push_back(2);
    v.push_back(3);
    for (iter = v.rbegin(); iter != v.rend(); iter++)
        printf("%d\t", *iter);
    5.begin(),end(),cbgin(),cend()
    4 자 는 모두 용기 의 구성원 함수 이다.
    cbeg()는 cend()와 begin()과 end()의 원리 가 같 습 니 다.다음은 begin()과 end()만 소개 합 니 다.
    1.개념:begin(),end()는 용기 의 특수 한 위 치 를 대표 하고 요소 의 첫 번 째 위치 와 마지막 요소 의 다음 위치 이다.
    아래 예 를 들 어 vector 의 모델 은 begin(),end()가 각각 위 치 를 대표 합 니 다.

    2.왜 이렇게 디자인 하 는가?
  • begin():우 리 는 용기 의 요 소 를 옮 겨 다 닐 때 보통 이 요소 의 첫 번 째 요 소 를 가 져 와 야 하기 때문에 bengin()을 설계 합 니 다
  • 4.567917.end():우리 가 교체 기 를 사용 하여 용 기 를 옮 겨 다 닐 때 보통 종료 조건(예 를 들 어 마지막 요 소 를 옮 겨 다 닐 때)이 필요 하지만 마지막 요 소 를 옮 겨 다 닐 때 버 릴 수 없 기 때문에 마지막 요소 의 다음 위 치 를 끝 표지 로 합 니 다6.rbegin(),rend(),crbegin(),crend()
    이 네 사람의 원 리 는 begin(),end(),cbgin(),cend()와 같 고 모두 용기 의 구성원 함수 이다.
    그러나 rbegin(),rend()는 각각 마지막 요소 와 첫 번 째 요소 의 앞 위 치 를 나타 낸다.

    7.교체 기의 연산
    설명:교체 기의 연산 자 는 일반적으로 교체 기 가 가리 키 는 요소 의 위 치 를 비교 하고 비교 결과 나 교체 기의 위 치 를 바 꾸 는 것 을 되 돌려 준다.
    교체 기 없 음+연산
    예 를 들 어 교체 기 iter,iter 1,iter 2 가 있 습 니 다.
    *iter 는 교체 기 가 가리 키 는 요소 의 인용 을 되 돌려 줍 니 다.
    iter->data 는 현재 가리 키 는 위치 요소 의 지침 을 대표 하 며 함수 나 구성원 에 접근 할 수 있 습 니 다.(*iter).data 와 같 습 니 다.
    ++iter 명령 교체 기 는 용기 의 다음 요 소 를 가리 키 고 있 습 니 다.
    --iter 명령 교체 기 는 용기 의 이전 요 소 를 가리킨다
    iter 1==iter 2 두 교체 기의 위치 가 같 는 지 판단 합 니 다.
    iter1!=iter 2 동상
    <,>=,<,<=동상
    iter+n 교체 기의 위 치 를 변경 합 니 다.
    iter-n 동상
    iter+=n 동상
    iter-=n 동상
    iter 1-iter 2 두 개의 교체 기 가 서로 줄 어 들 고 그들의 거 리 를 되 돌려 줍 니 다.
    인 스 턴 스:vector 의 요 소 를 옮 겨 다 니 며 공백 이 생기 면 옮 겨 다 니 기 를 중단 합 니 다. 
    
    vector<string> v = {"Hello","fwe",""};
    vector<string>::iterator iter;
    for (iter = v.begin(); iter != v.end() && !iter->empty(); ++iter)
    {
      cout << *iter<<"\t";
    }
    
    8.일부 코드 사례
    string 의 첫 번 째 문 자 를 대문자 로 변경 합 니 다.
    
    string s = "helloWorld";
    string::iterator it;
    if (s.begin() != s.end())//   s   
    {
      it = s.begin();
      *it = toupper(*it);
    }
    용기 요 소 를 사용 하 는 함수
    
    (*item).empty(); //      
    (*item).size(); //    
    중간 원소 의 교체 기 를 얻다
    
    auto mid=v.begin()+vi.size()/2;
    반 으로 접어 서 string 의 요 소 를 찾 습 니 다.
    
    string s = "abcdefghj";
    char foundChar = 'e';
    string::const_iterator l_iter=s.begin();
    string::const_iterator r_iter=s.end();
    string::const_iterator mid_iter = s.begin() + (r_iter - l_iter) / 2;
    while (mid_iter != r_iter && *mid_iter != foundChar)
    {
      if (*mid_iter > foundChar)
      {
        r_iter = mid_iter;
      }
      else
      {
        l_iter = mid_iter + 1;
      }
      mid_iter = l_iter + (r_iter - l_iter) / 2;
    }
    cout << *mid_iter << endl;
    C++교체 기 에 대한 소개(iterator,constiterator、reverse_interator、const_reverse_interator)의 글 은 여기까지 소개 되 었 습 니 다.더 많은 관련 C++교체 기 내용 은 우리 의 이전 글 이나 아래 의 관련 글 을 찾 아 보 세 요.앞으로 많은 응원 바 랍 니 다!

    좋은 웹페이지 즐겨찾기