#STL이란?
Standard : 표준 -> c++을 개발하는 곳에서 만든것
Template : 자료형의 구애받지 않고 함수가 동작하는것
Library : 언리얼엔진으로 치면 플러그인같은것(==로드해서 쓸 수 있는 코드 집합채)
c++에서 프로그램에 필요한 자료구조와 알고리즘을 Template(자료형에 구애받지않는 형틀)로 제공하는 가져다쓰는 코드 집합채를 STL이라고 한다.
좀 더 쉽게 말하자면 c++의 자료구조와 알고리즘을 자료형에 관계없이 편하게 쓰게끔 나온 플러그인이 STL이다.
템플릿에 대한 개념 추가 이해를 위해 유튜브 강의(탬플릿은 무엇인가)를 듣고 아래와 같이 학습하였다.
1.Template의 개념
STL은 다 템플릿으로 구현되어있다.
템플릿의 종류 : 1.함수 템플릿 2.클래스 템플릿
함수 템플릿이란?
오버로딩(같은 기능의 함수들을 이름을 하나로 중복하여 쓰이는 함수며,차이점은 들어가는 매개변수의 타입 즉 자료형이 다른 것)된 함수가 있는 경우 이걸 자료형의 차이만 있는것이니 자료형에 대한 타입을 나누지말고 하나로 묶어주자한 것
-> 함수를 만드는 형틀(Template)을 만들자!(!= 함수)
함수 템플릿 만드는 방법
1) 아래와 같이 템플릿을 선언하고 꺽쇠 안에 typename이라고 쓰고 그 뒤에 앞으로 너가 어떤 이름으로 자료형을 쓸건지의 목적으로 이름을 써준다.예로 들어 t라는 자료형을 부를거면 타입네임 뒤에 t라고 쓰면된다.(이름은 자유)
template
이제 기존 함수에 매개변수 자리에 있던 자료형들을 일일히 써줄 필요없이 내가 붙여준 자료형명만 써주고 뒤에 마저 인수만 들어가면된다.
함수 템플릿 적용 전
void testfunc(int a, int b, int c)
{
cout << a << b << c;
}
void testfunc(float a, float b, float c)
{
cout << a << b << c;
}
함수 템플릿 적용 후
template
void testfunc(ㅊ a, t b, t c)
{
cout << a << b << c;
}
void testfunc(t a, t b, t c)
{
cout << a << b << c;
}
이렇게 하면 어떤 타입의 인수를 보내든 다 처리해주는 만능 함수가 되게끔해줌
2) 여기서 중요한건 탬플릿은 함수가 아니라 형틀이다. 이 형틀이 있으면 컴파일러가 함수 템플릿을 선언한 코드를 실행할 때는 컴파일러가 탬플릿 자료형이 속에 인자가 int였으면 그게 int형을 받는 함수라고 인지하고 int형 함수를 하나 만든다.다름 오버로딩된 함수의 매개변수를 보고 또 다른 자료형의 함수를 생성한다.(공장처럼 형틀이 찍어냄)
즉 최종적으로는 컴파일러가 호출문을 보고 탬플릿을 가지고 실제 함수들을 만든다는것이다.이때 만들어진 함수를 "템플릿 함수"라 한다.여기서 형틀이 아닌 실제 함수가 만들어진 것임.(위에는 함수가 아닌 형틀이다)
3) 템플릿 함수가 만들어지는 만큼 실제로 호출될 때마다 메모리는 다 할당된다.
4) 호출 시 이렇게 써주기
int main()
{
testfunc(3,5,8);
testfunc(2.1,9.5,4.3);
return 0;
}
호출할때 't'한테 무슨 자료형으로 넘겨줄것인지를 함수이름과 인수 사이에 꺽쇠 안에 해당 자료형을 써줘야한다.
testfunc(3,5,8); -> testfunc(3,5,8);
testfunc(2.1,9.5,4.3); -> testfunc(2.1,9.5,4.3);
이렇게 안적어주면 컴파일러는 인수의 타입을 보고 그 인수의 자료형이라고 판단한다.만약 꺽쇠의 자료형과 인수의 자료형이 일치하는 경우는 <자료형>을 생략해도된다.그래도 정확한 방법으로 쓰자.
5) 탬플릿이 만드는 탬플릿 함수는 호출구문수와 비례한다.
출처 : 유튜브 허니C / C++ template 1 | 템플릿이 뭐예요??? | STL
2-1. STL의 구성요소 6가지
a. Container(컨테이너)
b. Iterator(이터레이터)
2-2. Container(컨테이너)
a. 객체를 저장하는 객체, 자료구조 라고도 한다.클래스 탬플릿으로 구현되어있다.컨테이너는 같은 타입의 여러 객체를 저장하는 객체로 일종의 객체들의 집합이다.
-> 배열처럼 한 객체(클래스 변수)로 여러 객체(클래스 변수)가 그 예다.이 배열같은 것이 바로 자료구조(==효율성을 위해 변수,숫자 등의 데이터들의 구조를 설계해서 저장하는 것)다.
ex) int형 변수(객체)를 어떻게 보관할 것인가?
-> 컨테이너는 클래스 탬플릿으로 작성되어 있어 컨테이너 변수를 생성할 때 탬플릿 인자로 요소의 타입을 명시해야 한다.따라서 대입할 수 있는 타입의 객체만을 저장해야하며 복사 생성 또한 가능하다.또한 요소 추가 및 제거를 포함해 다양한 기능을 수행하는 멤버 함수가 존재한다.
b. 자료구조의 종류 : 배열 외 5가지
ㄱ. 배열
c. 컨테이너의 종류
ㄱ.시퀀스 컨테이너(Sequence Container)
- array(c++11), vector, list, deque
ㄴ.어소시에이티브 컨테이너(연관,Associative Container)
- set, multiset, map, multimap
2-3. Algorithm(알고리즘)
a. 알고리즘의목적
자료구조에 저장된 데이터들이 어떻게 효율적으로 활용될 수 있는가를 정리해놓것
b. 정렬, 삭제, 검색, 연산 등을 해결하는 일반화된 방법을 제공하는
함수 템플릿
c. 멤버함수로 자료구조를 컨트롤한다.
2-4. Iterator(반복자)
a. 이터레이터의 목적
이터레이터는 포인터와 비슷한 개념으로 컨테이너의 원소를 가리키고,가리키는 원소에 접근하여 다음 원소를 가리키는 기능을 말한다.순회
이터레이터라는 클래스의 객체가 있다고 가정해보자.이 객체가 컨테이너에 접근할 때 이 포인터가 생긴 반복자(이터레이터)가지고 원소 하나하나를 가리키게 된다.포인터는 그냥 변수지만 이건 이터레이터라는 클래스의 객체란 걸 기억
기본적으로 클래스의 멤버 변수로 가지고 있다.
2-5.STL 안에도 여러 클래스가 존재함
클래스 하나당 컨테이너,이터레이터,알고리즘이 무조건 들어간다.
컨테이너
이터레이터
실습을 하면서 반복자를 공부하되 반복자의 종류는 상관없으니 종류별 공부는 skip하기
알고리즘
STL의 목적이 일반적인 알고리즘에 대한 효율적인 구현을 제공하는 것이다.
따라서 알고리즘에서는 컨테이너를 알고리즘을 통해 동작시키는데 필요한 많은 함수을 제공한다.따라서 컨테이너는 STL알고리즘 함수와 함께 사용되며 반복자를 통해 컨테이너에 적용시킨다.
정리가 잘 된 글이네요. 도움이 됐습니다.