C++ 표준 템플릿 라이브러리 STL(Standard Template Library)
- C++ 표준 라이브러리 중 하나
- 많은 제네릭 클래스와 제네릭 함수 포함
1. 컨테이너 - 템플릿 클래스
- 데이터를 담아두는 자료 구조를 표현한 클래스
- 리스트, 큐, 스택, 맵, 셋, 벡터
2. iterator - 컨테이너 원소에 대한 포인터
- 컨테이너의 원소들을 순회하면서 접근하기 위해 만들어진 컨테이너 원소에 대한 포인터
3. 알고리즘 - 템플릿 함수
- 컨테이너 원소에 대한 복사, 검색, 삭제, 정렬 등의 기능을 구현한 템플릿 함수
- 컨테이너의 멤버 함수 아님
헤더 파일
- 컨테이너 클래스를 사용하기 위한 헤더 파일
- 해당 클래스가 선언된 헤더 파일 include
#include <vector>
#include <list>
#include <algorithm>
이름공간
- STL이 선언된 이름 공간은 std
문자열을 저장하는 벡터 만들기
iterator 사용
- 반복자
- 컨테이너의 원소를 가리키는 포인터
- 구체적인 컨테이너를 지정하여 반복자 변수 생성
vector<int> v;
for(int i=1; i<=4; i++)
v.push_back(i);
vector<int>::iterator it;
it = v.begin();
it++;
int n = *it;
n=n*2;
*it = n;
it = v.erase(it);
it = v.end();
v.begin() = 배열의 첫 원소의 주소
v.end() = 배열의 마지막 원소 다음 원소의 주소
v.erase(it) = it가 가리키는 원소를 삭제한 후 다음 원소에 대한 포인터 리턴
map 컨테이너
- (키, 값)의 쌍을 원소로 저장하는 제네릭 컨테이너
동일한 '키'를 가진 원소가 중복 저장되면 오류 발생
- 키로 값 검색
- #include <map>
#include <iostream>
#include <string>
#include <map>
using namespace std;
int main() {
map<string, string> dic; // 맵 컨테이너 생성. 키는 영어 단어, 값은 한글 단어
// 단어 3개를 map에 저장
dic.insert(make_pair("love", "사랑")); // ("love", "사랑") 저장
dic.insert(make_pair("apple", "사과")); // ("apple", "사과") 저장
dic["cherry"] = "체리"; // ("cherry", "체리") 저장
cout << "저장된 단어 개수 " << dic.size() << endl;
string eng;
while (true) {
cout << "찾고 싶은 단어>> ";
getline(cin, eng); // 사용자로부터 키 입력
if (eng == "exit")
break; // "exit"이 입력되면 종료
if(dic.find(eng) == dic.end()) // eng '키'를 끝까지 찾았는데 없음
cout << "없음" << endl;
else
cout << dic[eng] << endl; // dic에서 eng의 값을 찾아 출력
}
cout << "종료합니다" << endl;
}
STL 알고리즘 사용하기
알고리즘 함수
- 템플릿 함수
- 전역 함수 : STL 컨테이너 클래스의 멤버 함수가 아님
- iterator와 함께 작동
#include <algorithm>
sort() 함수 사례
두 개의 매개 변수
- 매개변수 1 = 소팅을 시작한 원소의 주소
- 매개변수 2 = 소팅 범위의 마지막 원소 다음 주소
sort(v.begin(), v.end()); //벡터 전체 정렬
sort(v.begin(), v.begin()+3);
//v.begin()에서 v.begin()+2까지, 처음 3개 원소 정렬
v.begin()+3 는 마지막 원소 다음 주소를 의미하니까 정렬은 그 앞까지 이뤄짐.
sort(v.begin()+2, v.begin()+5); //벡터의 3번째 원소애서 v.begin()+4까지, 3개 원소 정렬
auto
- C++ 11 부터 auto 선언의 의미 수정 : 컴파일러에게 변수 선언문에서 추론하여 타입을 자동 선언하도록 지시.
- 이전까지는 스택에 할당되는 지역 변수를 선언하는 키워드
장점
- 복잡한 변수 선언을 간소하게, 긴 타입 선언 시 오타 줄임
auto pi = 3.14;
auto n = 3;
auto *p = &n;
int n = 10;
int &ref = n;
auto ref2 = ref; //ref2는 int& 변수로 자동 선언
다른 사례
- 함수의 리턴타입으로부터 추론하여 변수 선언
int square(int x) { return x*x; }
...
auto ret = square(3); // 변수 ret는 int 타입으로 추론
- STL 템플릿에 활용
vector<int>::iterator it; 없애고
for(auto it = v.begin(); it != v.end(); it++)
cout << *it << endl;