티스토리 뷰

카테고리 없음

Chapter 10 반복자

키성열 2022. 7. 10. 18:49
반응형

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
링크
«   2025/04   »
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
글 보관함
반응형