티스토리 뷰
Section 01 반복자의 종류
반복자란 포인터를 추상화한 클래스 객체이다.
입력반복자: 전방향읽기(istrea)
출력반복자: 전방향쓰기(ostream)
순방향 반복자(forward iterator):전방향 읽기, 쓰기
양방향반복자(bidirectional iterator):양방향 읽기, 쓰기(list, set, multiset, map, multimap)
임의 접근 반복자(random access iterator):랜덤 읽기, 쓰기
Section 02 X:iterator와 X::const_iterator
x::iteator 정방향 반복자의 내장형식, 반복자가 가리키는 원소 읽기, 쓰기 가능
x::const_iterator:정방향 반복자의 내장 형식, 반복자가 가리키는 원소의 읽기 가능
#include <iostream>
#include<vector>
#include<algorithm>
using namespace std;
int main(void)
{
vector<int> v;
v.push_back(10);
v.push_back(20);
v.push_back(30);
v.push_back(40);
v.push_back(50);
cout << "v[iterator 읽기 가능]: ";
for (vector<int>::iterator iter = v.begin(); iter != v.end(); ++iter)
cout << *iter << " ";
cout << endl;
cout << "v[const iterator 읽기 가능]: ";
for (vector<int>::const_iterator citer = v.begin(); citer != v.end(); ++citer)
cout << *citer << " ";
cout << endl;
vector<int>::iterator iter = v.begin();
vector<int>::const_iterator citer = v.begin();
*iter = 100;//쓰기 가능
//*citer=100; 쓰기 불가능
return 0;
}
#include <iostream>
#include<vector>
#include<algorithm>
using namespace std;
int main(void)
{
vector<int> v;
v.push_back(10);
v.push_back(20);
v.push_back(30);
v.push_back(40);
vector<int>::iterator iter = v.begin();
vector<int>::const_iterator citer = v.begin()+1;
const vector<int>::iterator const_iter = v.begin()+2;
const vector<int>::const_iterator const_citer = v.begin()+3;
*iter = 100; //가리키는 원소 변경 가능
++iter; //반복자 변경 가능
*citer = 200; //가리키는 원소 변경 불가능
++citer; //반복자 변경 가능
*const_iter = 300; //가리키는 원소 변경 가능
++const_iter; //반복자 변경 불가능
*const_citer = 400;//가리키는 원소 변경 불가능
++const_citer;//반복자 변경 불가능
return 0;
}
vector의 임의 접근 반복자와 list의 양방향 반복자
#include <iostream>
#include<vector>
#include<algorithm>
#include <list>
using namespace std;
class Point
{
int x;
int y;
public:
explicit Point(int _x=0, int _y=0):x(_x), y(_y){}
void Print() { cout << x << ',' << y << endl; }
};
int main(void)
{
vector<int> v;
v.push_back(10);
v.push_back(20);
v.push_back(30);
v.push_back(40);
list<int> lt;
lt.push_back(10);
lt.push_back(20);
lt.push_back(30);
vector<int>::iterator viter = v.begin();
list<int>::iterator liter = lt.begin();
cout << "vector: " << *viter << endl;
cout << "list: " << *liter << endl;
cout << "vector: " << *viter << endl;
cout << "list: " << *liter << endl;
cout << "vector: " << *++viter << endl;
cout << "list: " << *++liter << endl;
cout << "vector: " << *--viter << endl;
cout << "list: " << *--liter << endl;
viter += 2;
cout << "===================" << endl;
vector<Point> ptVector;
ptVector.push_back(Point(2, 5));
list<Point> ptList;
ptList.push_back(Point(2, 5));
vector<Point>::iterator ptViter = ptVector.begin();
ptViter->Print();
list<Point>::iterator ptLiter = ptList.begin();
ptLiter->Print();
return 0;
}
viter은 +=2가 가능하지만
liter은 +=2가 불가능하다.
Section 03 x::reverse iterator와 x::const_reverse_iterator
#include <iostream>
#include<vector>
#include<algorithm>
using namespace std;
int main(void)
{
vector<int> v;
v.push_back(10);
v.push_back(20);
v.push_back(30);
v.push_back(40);
v.push_back(50);
for (vector<int>::iterator iter = v.begin(); iter != v.end(); ++iter)
cout << *iter << " ";
cout << endl;
cout << "v[reverse_iterator]: ";
for (vector<int>::reverse_iterator riter = v.rbegin(); riter != v.rend(); ++riter)
cout << *riter << " ";
cout << endl;
return 0;
}
반복자 어댑터 reverse_iterator<T>
#include <iostream>
#include<vector>
#include<algorithm>
using namespace std;
int main(void)
{
vector<int> v;
v.push_back(10);
v.push_back(20);
v.push_back(30);
v.push_back(40);
v.push_back(50);
reverse_iterator<vector<int>::iterator> rbiter(v.end());
reverse_iterator<vector<int>::iterator> reiter(v.begin());
cout << "v [rbiter, reiter): ";
for (; rbiter != reiter; ++rbiter)
cout << *rbiter << " ";
cout << endl;
for (vector<int>::iterator iter = v.begin(); iter != v.end(); ++iter)
cout << *iter << " ";
cout << endl;
cout << "v[rbegin(), rend()): ";
for (vector<int>::reverse_iterator riter = v.rbegin(); riter != v.rend(); ++riter)
cout << *riter << " ";
cout << endl;
return 0;
}
Section 04 삽입 반복자
inserter(): insert_iterator 객체를 생성한다. 삽입모드를 가능하게 한다.
back_inserter(): back_insert_iterator객체를 생성, 뒤쪽에 삽입 가능하게 한다
front_inserter(): front_insert_iterator 앞에 삽입 가능하게 한다.
#include <iostream>
#include<vector>
#include<algorithm>
#include <iterator>
using namespace std;
int main(void)
{
vector<int> v;
v.push_back(10);
v.push_back(20);
v.push_back(30);
v.push_back(40);
v.push_back(50);
vector<int> v2;
copy(v.begin(), v.end(), inserter<vector<int>>(v2,v2.begin()));
reverse_iterator<vector<int>::iterator> rbiter(v.end());
reverse_iterator<vector<int>::iterator> reiter(v.begin());
cout << "v1: ";
for (vector<int>::iterator iter = v.begin(); iter != v.end(); ++iter)
cout << *iter << " ";
cout << endl;
cout << "v2: ";
for (vector<int>::iterator iter = v2.begin(); iter != v2.end(); ++iter)
cout << *iter << " ";
cout << endl;
return 0;
}
Section 05 입/출력 스트림 반복자
istream_iterator<T>:입력 스트림과 ㅇ녀결된 반복자로 T 형식의 값을 스트림에서 읽을 수 있습니다.
ostream_iterator<T>:출력 스트림과 연결된 반복자로 T 형식의 값을 스트림에 쓸 수 있다.
#include <iostream>
#include<vector>
#include<algorithm>
#include <iterator>
#include <list>
using namespace std;
int main(void)
{
vector<int> v;
v.push_back(10);
v.push_back(20);
v.push_back(30);
v.push_back(40);
v.push_back(50);
cout << "v1: ";
copy(v.begin(), v.end(), ostream_iterator<int>(cout));
cout << endl;
cout << "v1: ";
copy(v.begin(), v.end(), ostream_iterator<int>(cout,", "));
cout << endl;
list<int> lt;
lt.push_back(100);
lt.push_back(200);
lt.push_back(300);
cout << "lt+v: ";
transform(lt.begin(), lt.end(), v.begin(),
ostream_iterator<int>(cout, " "), plus<int>());
cout << endl;
return 0;
}
끝을 ','로 설정할 수 있다.
istream_iterator 반복자
#include <iostream>
#include<vector>
#include<algorithm>
#include <iterator>
#include <list>
using namespace std;
int main(void)
{
vector<int> v;
v.push_back(10);
v.push_back(20);
v.push_back(30);
v.push_back(40);
v.push_back(50);
cout << "v1: ";
copy(istream_iterator<int>(cin), istream_iterator<int>(),
back_inserter<vector<int>>(v));
cout << "v1: ";
copy(v.begin(), v.end(), ostream_iterator<int>(cout,", "));
cout << endl;
return 0;
}
istream_iterator<int>(cin):표준 입력 스트림과 연결된 반복자를 생성한다
istream_iterator<int>():입력 스트림의 끝 반복자를 생성한다
back_inserter<vector<int>>(v): push_back의 멤버 함수를 호출하는 삽입 반복자를 생성한다.
Section 06 반복자 특성과 보조 함수
advance(p, n): p 반복자를 p+=n의 위치로 이동시킨다
n=distance(p1,p2):n은 p2-p1입니다.
#include <iostream>
#include<vector>
#include<algorithm>
#include <iterator>
#include <list>
using namespace std;
int main(void)
{
vector<int> v;
v.push_back(10);
v.push_back(20);
v.push_back(30);
v.push_back(40);
v.push_back(50);
list<int> lt;
lt.push_back(10);
lt.push_back(20);
lt.push_back(30);
vector<int>::iterator viter(v.begin());
list<int>::iterator liter(lt.begin());
cout << "viter: " << *viter << endl;
cout << "liter: " << *liter << endl;
advance(viter, 2);
advance(liter, 2);
cout << "viter: " << *viter << endl;
cout << "liter: " << *liter << endl;
advance(viter, -2);
advance(liter, -2);
cout << "viter: " << *viter << endl;
cout << "liter: " << *liter << endl;
return 0;
}
distance() 보조함수
#include <iostream>
#include<vector>
#include<algorithm>
#include <iterator>
#include <list>
using namespace std;
int main(void)
{
vector<int> v;
v.push_back(10);
v.push_back(20);
v.push_back(30);
v.push_back(40);
v.push_back(50);
list<int> lt;
lt.push_back(10);
lt.push_back(20);
lt.push_back(30);
cout << "[v.beign(),v.end()의 원소 개수: " <<
distance(v.begin(), v.end()) << endl;
cout << "[lt.beign(),lt.end()의 원소 개수: " <<
distance(lt.begin(), lt.end()) << endl;
return 0;
}
반복자간의 차이를 리턴한다.
- Total
- Today
- Yesterday
- 사회심리학
- 파이썬
- 오블완
- C
- 백준
- K-MOOC
- EBS
- 윤성우
- 회계
- 보세사
- jlpt
- 통계학
- stl
- c++
- 뇌와행동의기초
- 류근관
- 일본어
- 정보처리기사
- 데이터분석
- 일본어문법무작정따라하기
- 인프런
- 심리학
- 여인권
- 열혈프로그래밍
- 일문따
- 코딩테스트
- 티스토리챌린지
- C/C++
- Python
- 인지부조화
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |