삽입 이터레이터

back_insert_iterator, front_insert_iterator, insert_iterator 가 있다.

 삽입은 기존 데이터 위에 쓰지 않고 새 원소들을 추가하며, 자동 메모리 대입을 사용하여 새 정보에
꼭 맞는 공간을 확보합니다. 

삽입 이터레이터는 컨테이너형을 템플릿 매개변수로 사용하고, 생성자를 매개변수로 컨테이너 식별자를 사용합니다. 

#include<iterator>
// vector<int> arr 이 선언되어 있다고 가정.

1) back_insert_iterator
	
    back_insert_iterator<vector<int> >back_iter(arr);
  	// back_iter라는 이터레이터 생성
    
2) insert_iterator
	
    insert_iterator<vector<int> >insert_iter(arr,arr.begin());
    // 두 번째 매개변수는 삽입될 위치를 지정.
   
 

컨테이너형을 사용해야 하는 이유

	이터레이터가 적절한 컨테이너 메서드를 이용해야 하기 때문이다.
    back_iter가, 접근 권한이 있는 vector<int>::push_back() 메서드를
    사용하는 것을 허용한다.
 

 

copy와 삽입이터레이터

#include<iostream>
#include<iterator>
#include<vector>
#include<string>
#include<algorithm>

void output(const std::string & s) { std::cout<<s<<" ";

int main() {
	
    using namespace std;
    
    string s[2] = {"Dookie2","tistory"};
    vector<string> arr(4);
    
    copy(s, s+2, back_insert_iterator<vector<string> >(arr));
    for_each(arr.begin(), arr.end(), output);
    
    copy(s, s+2, insert_iterator<vector<string> >(arr, arr.begin());
    for_each(arr.begin(), arr.end(), output);
    
    return 0;
}

/* 
 위 코드를 보면 
 copy()는 한 컨테이너에서 다른 컨테이너로 정보를 복사하는 데 사용하는 것 외에도
 출력스트림 -> 컨테이너, 입력스트림 -> 컨테이너로 정보를 복사하는 데에도 사용할 수 있다.
 더 나아가, 정보를 컨테이너 안에 삽입하는데에도 사용한다.
 copy()는 출력 이터레이터를 사용하는 여러 STL함수들 중 하나에 불과하므로, 미리 정의되어 있는
 이러한 이터레이터들이 그 함수의 기능을 확장한다.
 */

제약 사항

p.1276 박스

'C++' 카테고리의 다른 글

STL ( copy(), ostream_iterator, istream_iterator)  (0) 2021.02.16

이터레이터

하나의 컨테이너에서 다른 컨테이너로 데이터를 복사하는 copy() 라는 알고리즘이 있는데요. 이 알고리즘은 이터레이터들로 표현됩니다.

copy()에 전달하는 첫 번째, 두 번째 매개변수는 복사할 범위를 지정, 세 번째 이터레이터 매개변수는 첫 번째 항목이 복사될 위치를 가리킵니다. 처음 두 매개변수는 입력 이터레이터(또는 그보다 기능이 많은)고, 마지막 매개변수는 출력 이터레이터입니다.

#include<iterator>
...
ostream_iterator<int, char> out_iter(cout," ");

*out_iter++ = 15;    // cout<<15<<" ";처럼 동작한다.

이제 outer_iter 이터레이터는 cout을 사용하여 정보를 출력할 수 있게 해주는 인터페이스라고 할 수 있습니다. 첫 번째 템플릿 매개변수는 출력 스트림을 보내는 데이터형입니다.
두 번째 템플릿 매개변수는 출력 스트림이 사용하는 문자형을 나타냅니다. ( 출력 스트림에 보내진 각 항목 뒤에 표시되는 분리자)

이름이 있는 이터레이터 대신에 익명 이터레이터를 만들 수도 있구요.

copy(arr.begin(), arr.end(), ostream_iterator<int, char>(cout," ");

같은 논리로, iterator 헤더 파일은 istream 입력을 이터레이터 인터페이스에 맞개 개량하기 위한 istream_iterator 템플릿을 정의한다. 이것은 입력 이터레이터 개념의 모델이다.
이것을 이용하여 copy()에 입력범위를 지정해줄 수 있습니다.

copy(istream_iterator<int, char>(cin), istream_iterator<int, char>(), arr.begin());

생성자 매개변수로, cin을 사용하는 것은, cin이 관리하는 입력 스트림을 사용한다는 뜻입니다.
생성자 매개변수를 생략하는 것은, 입력 실패를 나타냅니다. ( 파일 끝, 데이터형 불일치, 입력 실패)

reverse_iterator

만약 arr 벡터의 내용을 역순으로 뒤집어 출력하려 한다고 합시다. vector 클래스는 past-the-end를 지시하는 reverse_iterator를 리턴하는 rbegin() 이라는 멤버 함수와, 첫 번째 원소를 리턴하는 rend() 멤버 함수를 가지고 있습니다.
따라서, 다음과 같은 구문을 사용하면 

copy(arr.rbegin(), arr.rend(), out_iter);	// 거꾸로 출력

컨테이너 내용을 뒤집어 출력할 수 있습니다. 다만 주의해야 할 사항이 있는데요,

vector<int>::reverse_iterator ri;

ri = arr.rbegin()		//ri에는 past-the-end가 들어가 있습니다.

//그래서 *ri는 앞에 있는 값을 참조해요.
//즉, ri가 여섯 번째 위치를 지시한다면, *ri는 다섯 번째 위치의 값이 되는 것이죠!

 

마지막으로

삽입 이터레이터와 같이 살펴보면 copy()는 한 컨테이너에서 다른 컨테이너로 정보를 복사하는데 사용할 수 있을 뿐만 아니라, 컨테이너에서 출력 스트림으로 또는 입력 스트림에서 컨테이너로 정보를 복사하는 데이도 사용할 수 있습니다.
이것은 미리 정의되어 있는 이러한 이터레이터들이 그 함수들의 기능을 확장시킨다고 할 수 있겠네요.

'C++' 카테고리의 다른 글

STL - 삽입 이터레이터  (0) 2021.02.18

+ Recent posts