STL
- C++ 표준 템플릿 라이브러리 중 하나
많은 제네릭 클래스와 제네릭 함수 포함 → 쉽게 프로그램 작성 할 수 있음
- 구성 요소
- 컨테이너 : 데이터를 담아두는 자료 구조를 표현한 클래스
- iterator : 컨테이너 원소에 대한 포인터
- 알고리즘 : 템플릿 함수
컨테이너란?
- 데이터를 담아두는 자료 구조를 표현한 클래스
- STL 의 구성 요소 중 하나
- 데이터를 저장하는 객체
- 컨테이너 구성 요소
- sequence containers
- associative containers
- container adapters
- 컨테이너 종류
- vector
- map
- list
- set
- stack
- queue
- deque
iterator란?
- 반복자
- 컨테이너의 원소를 가리키는 포인터
#구체적인 컨테이너를 지정하여 반복자 변수 생성
vector<int>::iterator it;
it = v.begin();

알고리즘 함수란?
- 템플릿 함수
- iterator와 함께 작동
- 전역함수 : STL 컨테이너 클래스의 멤버 함수가 아님
- sort() 함수 사례
- 두개의 매개 변수
- 첫 번째 매개변수 : 소팅을 시작한 원소의 주소
- 두 번째 매개변수 : 소팅 범위의 마지막 원소 다음 주소
#include <algorithm>
vector<int> v;
...
sort(v.begin(), v.end()); // 벡터 전체 정렬
sort(v.begin(), v.begin()+3); // v.begin()에서 v.begin()+2까지, 처음 3개 원소 정렬
sort(v.begin()+2, v.begin()+5); // 벡터의 3번째 원소에서 v.begin()+4까지, 3개 원소 정렬
STL과 관련된 헤더 파일
- 컨테이너 클래스를 사용하기 위한 헤더 파일
- 해당 클래스가 선언된 헤더 파일 include
#include <vector> //vector 클래스를 사용하려면
#include <list> //list 클래스를 사용하려면
//알고리즘 함수를 사용하기 위한 헤더 파일
#include <algorithm> //알고리즘 함수에 상관 없이
STL과 관련된 이름 공간
- STL이 선언된 이름 공간은 std
auto를 이용하여 쉬운 변수 선언
- C++11부터 auto 선언의 의미 수정 : 컴파일러에게 변수 선언문에서 추론하여 타입을 자동 선언하도록 지시
- C++11 이전까지는 스택에 할당되는 지역 변수를 선언하는 키워드
- 장점 : 복잡한 변수 선언을 간소화, 긴 타입 선언 시 오타 줄임
// 기본 활용 사례
auto pi = 3.14; // 3.14가 실수이므로 pi는 double 타입으로 선언됨
auto n = 3; // 3이 정수이므로 n을 int 타입으로
auto *p = &n; // 변수 p는 int* 타입으로 추론
int n = 10;
int & ref = n; // ref는 int에 대한 참조 변수
auto ref2 = ref; // ref2는 int& 변수로 자동 선언
// 다른 활용 사례 - 함수의 리턴 타입으로부터 추론하여 변수 타입 선언
int square(int x) { return x*x; }
...
auto ret = square(3); // 변수 ret는 int 타입으로 추론
// STL 템플릿에 활용 - vector<int>iterator 타입의 변수 it를 auto를 이용하여 간단히 선언
for (auto it = v.begin(); it != v.end(); it++)
cout << *it << endl;
예제 - 문자열을 저장하는 벡터 만들기 연습
#include <iostream> #include <string> #include <vector> using namespace std;
int main() {
vector<string> sv;
string name;
// 문자열 벡터 생성
cout << "이름을 5개 입력하라" << endl;
for(int i=0; i<5; i++) { // 한 줄에 한 개씩 5 개의 이름을 입력받는다.
cout << i+1 << ">>";
getline(cin, name);
sv.push_back(name);
}
name = sv.at(0); // 벡터의 첫 원소
for(int i=1; i<sv.size(); i++) {
if(name < sv[i]) // sv[i]의 문자열이 name보다 사전에서 뒤에 나옴
name = sv[i]; // name을 sv[i]의 문자열로 변경
}
cout << "사전에서 가장 뒤에 나오는 이름은 " << name << endl; }
예제 - iterator를 사용하여 vector의 모든 원소에 2 곱하기
#include <iostream>
#include <vector> using namespace std;
int main() {
vector<int> v; // 정수 벡터 생성 v.push_back(1);
v.push_back(2);
v.push_back(3);
vector<int>::iterator it; // 벡터 v의 원소에 대한 포인터 it 선언
for(it=v.begin(); it != v.end(); it++) { // iterator를 이용하여 모든 원소 탐색
int n = *it; // it가 가리키는 원소 값 리턴
n = n*2; // 곱하기 2
*it = n; // it가 가리키는 원소에 값 쓰기
}
for(it=v.begin(); it != v.end(); it++) // 벡터 v의 모든 원소 출력
cout << *it <<‘ ‘;
cout << endl;
}
예제 - sort() 함수를 이용한 vector 정렬
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
vector<int> v; // 정수 벡터 생성
cout << "5개의 정수를 입력하세요>> ";
for(int i=0; i<5; i++) {
int n;
cin >> n;
v.push_back(n); // 키보드에서 읽은 정수를 벡터에 삽입
}
// v.begin()에서 v.end() 사이의 값을 오름차순으로 정렬
// sort() 함수의 실행 결과 벡터 v의 원소 순서가 변경됨
sort(v.begin(), v.end());
// sort(v.begin(), v.begin()+3);
// sort(v.begin()+2, v.begin()+5);
vector<int>::iterator it; // 벡터 내의 원소를 탐색하는 iterator 변수 선언
for(it=v.begin(); it != v.end(); it++) // 벡터 v의 모든 원소 출력
cout << *it <<' ';
cout << endl;
}
예제 - auto를 이용한 변수 선언
#include <iostream>
#include <vector>
using namespace std;
int square(int x) { return x*x; }
int main() {
// 기본 타입 선언에 auto 활용
auto c = 'a'; // c는 char 타입으로 결정
auto pi = 3.14; // pi은 double 타입으로 결정
auto ten = 10; // ten은 int 타입으로 결정
auto *p = &ten; // 변수 p는 int* 타입으로 결정
cout << c << " " << pi << " " << ten << " " << *p << endl;
// 함수의 리턴 타입으로 추론
auto ret = square(3); // square() 함수의 리턴 타입이 int 이므로 ret는 int로 결정
cout << *p << " " << ret << endl;
vector<int> v = { 1,2,3,4,5 }; //벡터 v에 5개의 원소, 1,2,3,4,5 삽입
vector<int>::iterator it;
for (it = v.begin(); it != v.end(); it++)
cout << *it << " "; // 1 2 3 4 5 출력 cout << endl;
// 템플릿에 auto를 사용하여 간소화
for (auto it = v.begin(); it != v.end(); it++)
cout << *it << " "; // 1 2 3 4 5 출력
'개발 > C++' 카테고리의 다른 글
[C++] 제네릭 (0) | 2022.12.04 |
---|---|
[C++] 상속 (0) | 2022.11.27 |
[C++] Static (0) | 2022.11.20 |
[C++] 함수 중복 | 디폴트 매개변수 (feat. 복사 생성자) (0) | 2022.11.13 |
[C++] 객체 치환 / 참조에 의한 호출 / 벡터 (0) | 2022.11.04 |