프로그래밍언어/C++

[C++] 템플릿 (2)

qkzkdo 2023. 9. 21. 21:59
728x90

함수 템플릿

클래스 템플릿을 사용한다는 것은 멤버함수 템플릿을 사용한다는 것을 암시적으로 포함하고 있다. 그러나 클래스의 멤버함수가 아닌 전역함수에 대한 템플릿도 만들 수 있다.

 

템플릿의 멤버함수를 선언하는 방법

template <templateParameters>
ReturnType funcName(fParameterList) {
    .... //함수 몸체
}

 

함수 템플릿의 다중정의

함수 템플릿은 일반 함수와 마찬가지로 다중정의를 허용한다. 즉, 함수 템플릿과 이름이 같은 다른 함수가 존재할 수도 있다. 이름이 같은 함수가 여러 개 있을 때에는 함수 이름과 인수들의 데이터 형이 정확하게 일치하는 함수가 먼저 선택되어 호출되고, 그러한 함수가 없을 때에는 호출한 함수와 정확하게 일치시키는 변환이 가능한 함수 템플릿이 호출된다.

 

 

표준 템플릿 라이브러리(Standard Template Library, STL)

C++ 언어가 제공하는 템플릿을 사용한 컨테이너 클래스를 제공하는 라이브러리로서, 백터, 리스트, 큐 그리고 스택 등의 클래스 템플릿과 그 안에 저장된 데이터를 검색하고 정렬하는 등의 처리를 위한 함수들이 제공된다. STL의 목적은 프로그래머들이 많이 사용하는 공통적인 컨테이너 클래스를 제공하는 것이다.

 

STL의 구성 요소

STL은 여러가지 요소로 구성되어 있는데, 그중 핵심적인 것은 컨테이너, 반복자(iterator), 알고리즘이다.

 

컨테이너

컨테이너는 데이터를 저장하는 것으로, 저장하는 데이터는 int나 float과 같은 기본 자료형의 값일 수도 있고 사용자가 정의한 클래스의 객체들이 될 수도 있다.

컨테이너에는 순차 컨테이너, 연상 컨테이너, 무순서 연상 컨테이너 등의 기본 컨테이너와 컨테이너 어댑터가 있다.

  • 순차 컨테이너 : 동일한 자료형의 객체들을 선형적인 구조로 저장하는 것. vector, list, deque 등
  • 연상 컨테이너 : 키를 이용한 검색 기능을 제공하는 것. set, multiset, map, multimap 등
  • 무순서 연상 컨테이너 : 키를 이용한 검색 기능을 제공하나, 해시 함수를 이용함으로써 데이터 검색 시간이 데이터 수에 관계없이 일정함. unordered_set, unordered_multiset, unordered_map, unordered_multimap 등
  • 컨테이너 어댑터 : 기본 컨테이너를 기반으로 특정 용도에 맞게 유도된 컨테이너. queue, priority_queue, stack 등

 

반복자

반복자는 포인터의 개념이 일반화된 것으로, 컨테이너에 저장된 원소들을 엑세스하는 공통적인 방법으로 사용된다. 컨테이너의 유형에 따라 서로 다른 형태의 반복자가 사용된다.

순방향 반복자는 컨테이너의 앞쪽으로만 움직일 수 있으며, ++ 연산자가 이를 위해 사용된다. 양방향 반복자는 앞과 뒤로 움직일 수 있으며, 이를 위해 ++, -- 연산자가 정의되어 있다. 랜덤 엑세스 반복자는 양방향 반복자의 기능과 함께 임의의 위치로 이동할 수 있다.

 

알고리즘

알고리즘에는 컨테이너의 반복자가 인수로 전달되어 그 알고리즘이 어떤 객체 또는 범위에 대해 동작 할 것인지를 지정한다.

STL 알고리즘

알고리즘 목적
search 지정된 값 과 동일한 첫 번째 원소를 반환
count 지정된 값을 갖는 원소의 수를 반환
swap 컨테이너 안의 값을 교환
sort 컨테이너의 값들을 지정된 순서에 따라 정렬
merge 두 정렬된 영역의 원소들을 합병
reverse list의 원소들을 역순으로 나열
remove 컨테이너에서 지정된 값을 제거
replace 지정된 값을 다른 값으로 대체
unique 인접 위치에 있는 중복된 값을 제거
for_each 지정된 함수를 컨테이너의 모든 원소에 적용

 

vector

vector는 배열의 개념을 구현한 컨테이너로, 일반적인 배열의 기능을 포함하면서 여러 가지 유용한 멤버함수 및 관리 기능이 도입되어있다. 특히 배열처럼 크기가 고정되어 있지 않고 필요에 따라 저장공간을 확장할 수 있다.

 

vector 객체의 선언

vector를 사용하기 위해서는 #include 명령으로 헤더파일 <vector>를 프로그램에 삽입한다.

vector 객체를 선언하는 구문

vector<ClassName> objName(n);

※n : 백터에 저장할 객체의 수

 

[] 연산자

vector는 배열처럼 [] 연산자를 이용하여 객체 저장공간을 사용할 수 있다.

 

size()와 capacity()

vector의 멤버함수인 size()는 논리적인 크기를 알려주고, capacity()는 실제로 확보되어 있는 메모리 크기(물리적 크기)를 알려준다.

 

push_back()

벡터의 끝에 데이터를 추가하여 저장

insert()

지정된 위치에 데이터를 삽입

pop_back()

마지막 데이터를 제거

erase()

지정된 위치의 데이터를 삭제

 

반복자의 사용

반복자는 벡터의 원소에 대해 마치 포인터와 같은 방식으로 접근할 수 있도록 한다.

begin() : vector에 저장된 첫번째 원소를 나타내는 랜덤 엑세스 반복자를 반환

end() : vector에 저장된 마지막 데이터의 바로 다음 위치를 가리키는 반복자를 반환

 

알고리즘의 사용

sort() 알고리즘의 사용

형식1: sort(first, last);
형식2: sort(first, last, comp);
※ first: 정렬할 범위의 시작 원소에 대한 포인터
※ last: 정렬할 범위의 마지막 원소의 다음 원소에 대한 포인터
※ comp: 정렬 순서를 정하는 함수

merge() 알고리즘의 사용

형식1: merge(first1, last1, first2, last2, dest);
형식2: merge(first1, last1, first2, last2, dest, comp);
※ first1, last1: 첫 번째 정렬된 데이터의 범위
※ first2, last2: 두 번째 정렬된 데이터의 범위
※ dest: 합병 결과가 저장될 시작 위치
※ comp: 합병 순서를 저장하는 함수

 

map

map은 키를 이용하여 원소에 접근할 수 있는 컨테이너이다.

 

map 객체의 선언

map을 사용하기 위해서는 #include 명령으로 헤더파일 <map>을 프로그램에 삽입한다.

map 객체를 선언하는 기본적인 형식

map<KeyType, ValueType, Traits> objName;

※ KeyType : 키의 자료형
※ ValueType : 키와 연관된 데이터의 자료형
※ Traits : map 내에서의 상대적 순서를 결정하는 함수객체의 클래스

 

insert() 함수 및 [] 연산자

map에 데이터를 저장하는 것은 insert() 함수를 사용할 수 있다.

 

데이터의 검색

find() 함수를 이용하여 저장된 키를 갖는 데이터를 map에서 검색할 수 있다.

 

데이터의 삭제

erase() 함수를 이용하여 map에 저장된 데이터를 삭제할 수 있다.

 

 

 

출처 : 전중남·이병래. 「C++프로그래밍」. 한국방송통신대학교출판문화원. 2020

728x90