본문 바로가기

[ C/ C++ 프로그래밍 ]/[ STL ]

[ 혼연 정리 ] 시퀀스 컨테이너 - 4 [ 벡터 ] ㅇ 사용자 정의 요소 --> 심도있게보자 - 클래스 객체를 요소로 가지는 벡터도 만들수 있다. 1 #include 2 #include 3 4 using namespace std; 5 6 class Time 7 { 8 protected: 9 int hour,min,sec; 10 public: 11 Time(int h,int m,int s) { hour=h;min=m;sec=s; } 12 void OutTime() { printf("%d:%d:%d ",hour,min,sec); } 13 }; 14 15 template 16 void dump(const char *desc, C c) 17 { 18 cout.width(12);cout 그렇지 않으면 메모리 누수 발생 - 임의의 타입에서 일정 조건을 만족하는 타입.. 더보기
[ 혼연 정리 ] 시퀀스 컨테이너 - 3 [ 벡터 ] ㅇ 대입 - '=' 연산자를 사용 - 대입을 받는 좌변 벡터는 우변 벡터의 크기만큼 자동으로 크기가 늘어남 - 깊은 복사를 함 - 좌변 벡터에 원래 들어 있던 값은 파괴됨 - void assign( size_type count, const Type& val) : val값을 count 만큼 복사 - void assign( InIt first, InIt last) : 반복자 구간을 복사 - 예제 1 #include 2 #include 3 #include 4 5 using namespace std;z 6 template 7 void dump(const char *desc, C c) 8 { 9 cout.width(12); 10 cout 들어 있는 값이 같다면 같다. - 대소를 비교할 때는 대응되는 각 요소들을 .. 더보기
[ 혼연 정리 ] 시퀀스 컨테이너 - 2 [ 벡터 ] ◎ 벡터의 삽입과 삭제 - 각 컨테이너별로 내부적 구조가 다르다 -> 삽입, 삭제 방식도 컨테이너별로 다르다. - 다르기 때문에 삽입, 삭제는 일반함수보다는 컨테이너 멤버함수로 제공 - 벡터의 제일 끝 부분에서 삽입, 삭제 수행 ◎ 멤버 함수 ㅇ void push_back(const T& x); - 벡터 끝에 새 요소 x를 추가하고 필요할 경우 메모리관리를 한다. ㅇ void pop_back(); - 앞쪽에서 요소를 삽입, 삭제하는 push_front, pop_front 함수는 제공 하지 않음 ㅇ insert() 함수 - insert 함수를 사용해서 중간에 요소 삽입은 가능 - 삽입하기 전에 메모리가 부족할 경우 재할당 하여 늘린다. iterator insert (iterator it, const T& .. 더보기
[ 혼연 정리 ] 시퀀스 컨테이너 - 1 [ 벡터 ] ㅇ 벡터 - 동일 타입의 자료 집합인 시퀀스 컨테이너의 대표 - 내부 구성원리는 C의 정적 배열과 거의 유사 - 요소들의 크기가 같고 인접한 위치에 이웃하여 배치된다 - 메모리를 적게 차지 - 임의 위치를 빠른 속도로 엑세스 - 삽입,삭제속도 느림 ( 인접 배치 원칙을 지키기 위해서 요소를 이동시켜야됨) - template class vector class Type : 요소 타입, class Allocator : 할당기(생략가능) ㅇ 벡터의 생성자 - explicit vector(); /// 디폴트 생성자 - explicit vectorr(size_type n, const T& v = T() ); /// 크기 와 T 타입의 초기값 지정 - vector (const vector& x); /// 복사 생성자.. 더보기
[ 혼연 정리 ] 반복자- 1 [ 반복자 정의 ] ㅇ 반복자 정의 컨테이너의 한 지점을 가리키는 객체 알고리즘이란 컨테이너 자체에 대해 적용하는 것이 아니라 결국은 컨테이너의 요소들에 적용되는 것이므로 요소를 읽고 쓸 수 있어야 하는데 이를 위해 반복자가 사용된다. 알고리즘은 반복자를 통해 컨테이너의 요소를 읽고 변경하며 컨테이너는 알고리즘을 호출할 때 작업 대상 요소를 반복자로 지정한다. 그래서 반복자를 알고리즘과 컨테이너를 연결하는 매개체라고 한다. 반복자를 통해서만 컨테이너의 요소에 접근한다. 반복자를 관리하는 기본적인 방법은 ++, --, *, ==. > , 더보기
[ 혼연 정리 ] 함수객체- 5 [어뎁터 ] ㅇ 어뎁터 이미 만들어진 컴포턴트의 구현은 그대로 활용하고 인터페이스만 조금 변경하여 컴포넌트를 일부 변형시키는 것이다. STL이 제공하는 컴포넌트의 수가 많고 일반화되어 있기는 하지만 그래도 특수한 프로그래밍 환경에 두로 사용되기에는 결코 충분하지 않다. 그렇다고 컴포넌트의 수를 무한정 늘리기만 할 수 없으므로 기존 컴포넌트를 변경할 수 있는 어뎁터라는 방법을 제공한다. 어뎁터는 일반화된 컴포넌트의 용도를 더욱 확장하는 역할을 한다. 어뎁터는 컴포넌트, 반복자, 함수 객체에 대해 적용되며 다음과 같이 분류 할 수 있다. 함수 객체의 기능을 조금이라도 변경하려먼 어댑터를 적용할 수 있도록 만들어야 하는데 이런 함수 객체를 어댑터블(Adapter) 함수 객체라고 한다. 기능을 변경하는 어댑터는 대상 함수 .. 더보기
[ 혼연 정리 ] 함수객체- 4 [함수 객체의 종류] ㅇ 함수객체의 종류 함수 객체가 하는 일은 비교, 대입, 합산 등 알고리즘 구현중에 필요한 연산을 처리하는 것이다. 밑의 표는 함수객체의 종류를 나타내는 표이다. InIt find_if(InIt first, InIt last, UniPred F); /// 단항 bool 리턴 void sort(RanIt first, RanIt last, BinPred F); /// 이항 bool 리턴 T accumulate(InIt first, InIt last, T val, BinOp op); /// 이항 bool이 아닌 값을 리턴 1 struct print { 2 void operator()(int a, int b) const { 3 printf("%d\n",a); 4 } 5 }; 6 7 UniOp for_each(I.. 더보기
[ 혼연 정리 ] 함수객체- 3 [미리 정의된 함수 객체] 함수 객체는 통상 ()연산자 하나만 정의하고 그나마도 동작이 간단해 길이가 아주 짧다., 그래서 STL은 자주 사용할만한 연산에 대해 미리 함수 객체를 정의하고 있다. ==> 별다른 정의 없이 그냥 사용하면 된다. - plus 대표적으로 가장 간단한 함수 객체 1 struct plus : public binary_function { 2 T operator()(const T& x, const T& y) const { return (x+y); } 3 }; 더할 피연산자의 타입 T를 인수로 받아들이는 클래스 탬플릿이다. 예 제 : plus 1 #include 2 #include 3 4 using namespace std; 5 6 void main() 7 { 8 int nNum1 , nNum2 ; 9 int n.. 더보기
[ 혼연 정리 ] 함수객체- 2 [알고리즘의 변형] for_each 처럼 함수 객체를 명시적으로 요구하는 알고리즘도 있고 필요할 때만 함수 객체를 옵션으로 받는 알고리즘도 있다. find는 순회중의 반복자 값과 세번째 인수로 지정한 값(val)을 == 연산자로 비교하여 정확하게 일치하는 요소를 찾아낸다. 그런대 때로는 ==로 정확한 일치를 검색하는 것이 아니라 사용자가 정의하는 방식으로 검색할 욧소를 골라야 하는 경우도 있다. 이때 함수 객체로 요소를 직접 비교할 수 있는데 이런 함수는 보통 원래 함수의 이름 끝에 _if가 붙는다. find의 함수 객체 버젼은 다음과 같다. InIt find_if(InIt first, InIt last, UniPred F); 세번째 인수는 F는 () 연산자를 오버로딩하는 함수 객채이며 요소값 하나를 인수로 전달받아 이 값.. 더보기
[ 혼연 정리 ] 함수객체- 1 [함수객체] ㅇ 함수 객체 STL의 알고리즘들은 전역 함수가 처리하며 문제를 풀기 위한 반복자 구간, 검색 대상, 채울 값 따위의 정보들이 함수의 인수로 전달된다. 알고리즘 함수들은 입력된 정보를 바탕으로 알아서 동작하지만 어떤 함수들은 내부에서 모든 동작을 다 처리하지 않거나 할수 없는 경우도 있다. 검색하고자 하는 값이 정확하게 어떤 조건인지, 정렬을 위해 요소를 어떤 방식으로 비교할 것인지를 함수가 마음대로 결정 할 수 없다. 이때 함수에게 좀더 구체적인 처리 방식을 지정하기 위해 사용자가 미리 만들어 놓은 함수 객체를 전달한다. 알고리즘 함수는 동작중에 사용자의 개입이 필요한 부분에 대해서 함수 객체를 호출하여 의사를 결정한다. for_each 함수를 사용하면 순회를 대신 시킬 수 있으며 이때 순회 중에 어떤.. 더보기