본문 바로가기
프로그래밍 기록/stl

반복자 ostream_iterator,istream_iterator,fwdbiiterator,advance,wrongiter,copyoverwrite,vectorinsert,revcopy,constiterator,revit,revfind,revbase

by hominic 2023. 12. 9.
728x90
반응형

ostream_iterator

#include <iostream>
#include <list>
using namespace std;

void main()
{
	int ari[]={1,2,3,4,5};
	list<int> li(&ari[0],&ari[5]);

	ostream_iterator<int> oit(cout,",");
	copy(li.begin(),li.end(),oit);
	// copy(li.begin(),li.end(),ostream_iterator<int>(cout,","));
}

istream_iterator

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

template<typename C> 
void dump(const char *desc, C c)
{
	cout.width(12);
	cout << left << desc << "==> ";
	copy(c.begin(),c.end(),ostream_iterator<typename C::value_type>(cout," "));
	cout << endl;
}

void main()
{
	vector<int> vi(16);
	istream_iterator<int> iit(cin);
	copy(iit,istream_iterator<int>(),vi.begin());
	//copy(istream_iterator<int>(cin),istream_iterator<int>(),vi.begin());
	dump("입력 완료 후",vi);
}

 

fwdbiiterator

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

template<typename C> void dump(const char *desc, C c) { cout.width(12);cout << left << desc << "==> ";
	copy(c.begin(),c.end(),ostream_iterator<typename C::value_type>(cout," ")); cout << endl; }

void main()
{
	int ari[]={78,85,95,93,86,60,72,99,56,85};
	vector<int> vi(&ari[0],&ari[10]);

	dump("원본",vi);
	replace(vi.begin(),vi.end(),85,100);
	dump("대체후",vi);
	reverse(vi.begin(),vi.end());
	dump("뒤집은 후",vi);
}

advance

#include <iostream>
#include <list>
using namespace std;

void main()
{
	int ari[]={1,2,3,4,5,6,7};
	list<int> li(&ari[0],&ari[7]);

	list<int>::iterator it=li.begin();
	printf("%d\n",*it);					// 읽을 수 있다.
	printf("%d\n",*(++it));				// 한칸 전진 가능
//	printf("%d\n",it[3]);				// 에러:임의 위치를 읽지는 못함
//	it+=3;								// 에러:임의 위치로 이동하지 못함
	advance(it,3);						// advance로 이동 가능
	printf("%d\n",*it);					
//	printf("거리=%d\n",li.end()-li.begin());				// 에러:반복자끼리 뺄셈은 안됨
	printf("거리=%d\n",distance(li.begin(),li.end()));	// distance로 거리를 구하는 것은 가능
}

 

wrongiter

#include <iostream>
#include <list>
#include <algorithm>
using namespace std;

void main()
{
	int ari[]={2,8,5,1,9};
	list<int> li(&ari[0],&ari[5]);

	sort(li.begin(),li.end());
}

 

copyoverwrite

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

template<typename C> void dump(const char *desc, C c) { cout.width(12);cout << left << desc << "==> ";
	copy(c.begin(),c.end(),ostream_iterator<typename C::value_type>(cout," ")); cout << endl; }

void main()
{
	int ari[]={1,2,3,4,5};
	vector<int> vi(&ari[0],&ari[5]);
	int ari2[]={6,7,8,9,10,11,12,13,14,15};

	vector<int>::iterator it;
	it=find(vi.begin(),vi.end(),4);
	copy(&ari2[0], &ari2[10], it);
	dump("복사 후",vi);
}

 

 

vectorinsert

#include <iostream>
#include <vector>
#include <list>
using namespace std;

template<typename C> void dump(const char *desc, C c) {	cout.width(12);cout << left << desc << "==> ";
	copy(c.begin(),c.end(),ostream_iterator<typename C::value_type>(cout," ")); cout << endl; }

void main()
{
	int ari[]={1,2,3,4,5};
	vector<int> vi(&ari[0],&ari[5]);

	dump("원본",vi);
	insert_iterator<vector<int> > insit(vi,vi.begin()+2);
	*insit=99;
	*insit=100;
	dump("삽입후",vi);
}
반응형

revcopy

#include <iostream>
#include <list>
using namespace std;

void main()
{
	int ari[]={1,2,3,4,5};
	list<int> li;

	copy(&ari[0],&ari[5],front_inserter(li));
	copy(li.begin(),li.end(),ostream_iterator<int>(cout," "));cout << endl;
}

 

 

constiterator

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int vectorsum(const vector<int> &cvt)
{
	vector<int>::const_iterator cit;
	int sum=0;

	for (cit=cvt.begin();cit!=cvt.end();cit++) {
		sum+=*cit;
	}
	// *cit=1234;		// 에러
	return sum;
}

void main()
{
	int ari[]={80,98,75,60,100};
	vector<int> vi(&ari[0],&ari[5]);

	int sum;
	sum=vectorsum(vi);
	printf("총 합은 %d입니다.\n",sum);
}

 

revit

#include <iostream>
#include <vector>
using namespace std;

void main()
{
	int ari[]={1,2,3,4,5};
	vector<int> vi(&ari[0],&ari[5]);

	vector<int>::reverse_iterator rit;
	for (rit=vi.rbegin();rit!=vi.rend();rit++) {
		printf("%d\n",*rit);
	}
}
728x90

 

revfind

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

void main()
{
	int ari[]={6,2,9,2,7};
	vector<int> vi(&ari[0],&ari[5]);

	puts(find(vi.begin(),vi.end(),2)==vi.end() ? "없다.":"있다.");
	puts(find(vi.rbegin(),vi.rend(),2)==vi.rend() ? "없다.":"있다.");
}

 

 

revbase

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

void main()
{
	const char *str="c++ standard template library";
	vector<char> vc(&str[0],&str[strlen(str)]);

	vector<char>::reverse_iterator rit;
	vector<char>::iterator bit,it;
	rit=find(vc.rbegin(),vc.rend(),'t');
	bit=rit.base();
	it=find(bit,vc.end(),'a');
	if (it!=vc.end()) {
		printf("검색 결과 = %c\n",*it);
	}
}

 

 

2023.12.09 - [프로그래밍 기록/c++] - 함수 객체 dualinstance, Predicate, not2, IsMulti, bind2nd, ptr_fun, mem_fun

728x90
반응형

댓글