STL은 Standard Template Library의 줄임말으로 표준 템플릿 라이브러리인데, 여러 자료 구조, 함수, 알고리즘 등을 쓰기 쉽게 라이브러리화 해둔 것이다.
대표적으로
#include <iostream>
#include <vector>
#include <map>
등이 있다.
STL은 알고리즘, 컨테이너, 함수자, 반복자 4가지로 구성되어있는데
도커의 컨테이너가 생각이 날 수도 있지만 전혀 다르다.
c++에서 컨테이너는 다른 객체를 요소로 저장하는 객체이다.
또한, 요소의 저장 공간을 관리하고 직접 또는 반복자를 통해 액세스할 수 있는 멤버 기능을 제공한다.
컨테이너 중 하나인 vector를 직접 사용해보도록 하자.
vector는 자동으로 메모리가 할당되는 배열이다.
위에서 설명했다시피 동적 배열로써 자동으로 배열의 크기를 조절하여 유연한 객체의 추가, 삭제가 가능한 구조이다.
#include <vector>
using namespace std;
// 1. 기본 생성 및 초기화 없이 정의
vector<int> vec1;
// 2. 특정 크기와 초기값으로 벡터 정의
vector<int> vec2(5, 10); // 크기 5, 모든 원소가 10으로 초기화
// 3. 리스트 초기화로 벡터 정의
vector<int> vec3 = { 1, 2, 3, 4, 5 };
#include <vector>
#include <iostream>
using namespace std;
int main() {
vector<int> vec;
// 2차원 벡터 초기화
vector<vector<int>> vec2D(3, vector<int>(4, 7)); // 3x4 행렬, 모든 원소가 7로 초기화
cout << "2차원 배열:" << vec2D[0][0] << endl;
vec.push_back(40);
vec.push_back(90);
vec.push_back(80);
vec.push_back(70);
for (int i = 0; i < vec.size(); i++) {
cout << vec[i] << endl;
}
// 제일 뒤에 있는 값 제거
/*vec.pop_back();
vec.pop_back();*/
// erase, begin 이용
// 1번째 요소 제거
vec.erase(vec.begin() + 1);
// 1~ 3 요소 제거 ( 0 ~ 3 ) 레인지
vec.erase(vec.begin() + 1, vec.begin() + 3);
cout << "제거 후" << endl;
// 향상된 for문 - 파이썬문법?
for (int num : vec) {
cout << num << endl;
}
}
이런식으로 vector를 사용해서 요소를 추가 및 제거, 조회를 해보았다.
각 노드가 key와 value 쌍으로 중복을 허용하지 않는 트리이다.
map은 first,second가 있는 pair 객체로 저장되는데 first = key, second = value 순으로 저장된다.
map은 자료를 저장할 때 내부에서 자동으로 오름차순으로 정렬한다.
#include <iostream>
#include <map>
using namespace std;
int main() {
map<int, string> sampleMap;
// map은 pair (키 - 밸류)로 된 하나의 객체로 되어있음
// insert, make_pair로 삽입
sampleMap.insert(make_pair(1, "ABCD"));
// 그냥 삽입
sampleMap[2] = (1, "ABC");
// find로 검색
map<int, string>::iterator it = sampleMap.find(2);
// 찾은 요소에서 키와 밸류 값 뽑기
cout << "find 검색 key: " << it->first << endl;
cout << "find 검색 key: " << it->second << endl;
// clear로 삭제하기
sampleMap.clear();
// 맵의 키-값 수 찾기 - size
cout << "맵 크기: "<< sampleMap.size() << endl;
for (int i = 0; i < sampleMap.size(); i++) {
if (sampleMap[i] != " ") {
cout << sampleMap[i] << endl;
}
}
// iterator 반복자를 이용하여 시작과 종료 위치를 지정해줌
for (map<int, string>::iterator it = sampleMap.begin(); it != sampleMap.end(); ++it) {
cout << it->first << ": " << it->second << endl;
}
}
이런식으로 map구조를 만들어 직접 뽑아볼 수 있다.