반복자(iterator) : 포인터를 추상화한 클래스 객체
반복자의 종류
- 입력 반복자(input_iterator)
- 출력 반복자(output_iterator)
- 순방향 반복자(forward_iterator)
- 양방향 반복자(bidirectional_iterator)
- 임의 접근 반복자(random_access_iterator)
삽입 반복자 : 순차열에 원소를 삽입(insert)할 수 있게 반복자를 변환하는 반복자 어댑터

#include <iostream>
using namespace std;
std::iterator : 정방향 반복자의 내장 형식, 반복자가 가리키는 원소 읽기,쓰기 가능
std::const_iterator : 정방향 반복자의 내장 형식, 반복자가 가리키는 원소 읽기,쓰기 가능
#include <iostream>
using namespace std;
std::reverse_iterator : 역방향 반복자의 내장 형식, 반복자가 가리키는 원소 읽기,쓰기 가능
std::const_reverse_iterator : 역방향 반복자의 내장 형식, 반복자가 가리키는 원소 읽기,쓰기 가능

inserter() : insert_iterator객체를 생성, 객체는 컨테이너의 insert() 멤버 함수를 호출해 삽입 모드로 동작하게 함
back_inserter() : back_insert_iterator객체를 생성, 객체는 컨테이너의 push_back() 멤버 함수를 호출해 뒤쪽에 추가(삽입)하게 함
front_inserter() : front_insert_iterator객체를 생성, 객체는 컨테이너의 push_front() 멤버 함수를 호출해 앞쪽에 추가(삽입)하게 함
istream_iteartor<T> : 입력 스트림과 연결된 반복자로 T형식의 값을 스트림에서 읽을 수 있음
ostream_iterator<T> : 출력 스트림과 연결된 반복자로 T형식의 값을 스트림에 쓸 수 있음
<예시>
copy(v.begin(), v.end(), ostream_iterator<int>(cout) -> cout에 [v.begin(), v.end())값을 출력시켜줌
copy(v.begin(), v.end(), istream_iterator<int>(cin) -> cin으로부터 [v.begin(), v.end())값을 입력받음
advance(p,n) : 반복자를 p += n의 위치로 이동
n = distance(p1, p2) : n = p2 - p1 / n은 difference_type
template<class Iter>
struct Iterator_traits
{
typedef typename Iter::iterator_category iterator_category;
typedef typename Iter::value_type value_type;
typedef typename Iter::difference_type difference_type;
typedef typename Iter::pointer pointer;
typedef typename Iter::reference reference;
}
struct input_iterator_tag{};
struct output_iterator_tag{};
struct forward_iterator_tag : public input_iterator_tag{};
struct bidirectional_iterator_tag : public forward_iterator_tag {};
struct random_access_iterator_tag : public bidirectional_iterator_tag {};