PS에서 자주 쓰이는 STL 문법
새로 배울 때마다 계속 추가함
유용한 구문은 빨간 글씨
string
cin >> str : 공백문자 전까지만 문자열에 저장
getline(cin, str) : 공백문자까지 포함해 입력받은 한 줄 전체를 문자열에 저장
iterator
vector, map 등 컨테이너 내부의 각 원소를 가리키는 일종의 포인터
구간 지정할 때 자주 쓴다
사용할 컨테이너와 동일한 구조에서 선언
ex) vector<int>::iterator iter
v.begin() : v의 시작 원소
v.end() : v의 끝 원소 다음
활용
*iter : 값 접근
iter = v.begin();iter != v.end(); iter++ : 배열 순회
iter++ : 임의접근( ex) 배열처럼 v[1], v[2] 이렇게 접근) 이 가능한 컨테이너만 가능
vector : 일반적으로 사용하는 배열
생성
vector<int> v : 빈 배열
vector<int> v(10) : 크기 10, 값 0
vector<int> v(10, 5) : 크기 10, 값 5
vector<int> v(v2) : v2와 동일한 배열
*int 대신 사용자 정의 자료형을 포함한 다른 자료형도 들어갈 수 있다
vector<vector<int>> : 2차원 배열
Row m, Col n의 2차원 배열 생성 : vector<vector<int>> v_2d(m, vector<int> (n))
= (int n개 짜리 배열) m개 짜리 배열
vector<part<int, int>> : 순서쌍의 배열
v.push_back(5) : 맨 뒤에 삽입
v.size() : 배열의 원소 개수 반환
v.pop_back() : 맨 뒤 원소 삭제
배열에 입력받기
for(T& i : v) cin >> i;
stack : 삽입과 삭제가 top에서만 이뤄지는 자료구조
S.push(5) : top에 삽입
S.pop() : 반환값 X, top의 원소를 삭제
S.top() : top의 원소값을 반환
queue : 삽입은 last, 삭제는 front에서 이뤄지는 자료구조
Q.push(5) : 맨 뒤에 삽입
Q.pop() : 반환값 X, front의 원소를 삭제
Q.front() : front의 원소값을 반환
* priority_queue : 우선순위가 가장 높은 원소부터 삭제되는 자료구조
생성
priority_queue <int, vector<int>, greater<int>> pq // 자료형, 저장 컨테이너, 비교자 = 우선순위(defalut : less)
top에 위치하는 데이터는 pq 내의 모든 데이터에 대하여 비교 결과가 거짓이 나오는 데이터??
일단 less -> 최대힙, greater -> 최소힙으로 외워두기
PQ.push(5), PQ.pop(), PQ.top() : queue와 유사
list : 자료가 양방향으로 하나씩 연결된 자료구조
iter++, iter-- : 다음 노드, 이전 노드로 이동
push_back, pop_back : 맨 마지막 노드에 삽입, 삭제
pust_front, pop_front : 맨 앞 노드에 삽입, 삭제
map : 자료가 key, value로 저장되는 자료구조
map<string, int> M : key가 문자열, value가 정수인 맵
ex) M["Hi"] = 3
어떤 key가 map에 존재하지 않으면 value = 0
++, += 등의 연산자 사용 가능
ex) cin>>str; M[str]++;
* map 순회
for(pair<string, int> P : M) cout << P.first() << ' ' << P.second() << '\n';
algorithm
min_element(v.begin(), v.end()) : 최소값 찾기, 반복자 반환 => *로 값 접근
find(v.begin(), v.end(), 3) : 값 찾기, 찾으면 해당 반복자, 못 찾으면 마지막 반복자(v.end()) 반환
count(v.begin(), v.end(), 3) : 값 세기, 정수 반환
swap_ranges(v.begin(), v.begin()+3, v1.begin()) : 일정 구간 스왑
sort(v.begin(), v.end()) : 정렬, 비교 기준 : < (오름차순), 비교 결과 거짓일 경우 자리를 바꾼다
sort(v.begin(), v.end(), greater<int>) : 내림차순 정렬
unique(v.begin(), v.end()) : 인접한 중복값 제거
=> 실제 제거되는 것이 아니라 중복값을 뒤로 보내고, 중복값이 제거된 끝 반복자를 반환한다.
ex) unique([1 1 2 3 4 4 5]) -> [1 2 3 4 5(반환값)1 4]
erase(v.end() - 3, v.end()) : 일정 구간 삭제, 주로 unique와 연계해서 자주 쓴다
ex) erase(unique(v.begin(), v.end()), v.end()) -> v 벡터의 중복값이 제거된 끝 반복자,
다시 말하면 중복값들만 남겨진 반복자부터 끝 반복자까지의 구간을 제거하므로 결과적으로 중복값이 아예 삭제된다.
// 정렬된 상태에서 사용하는 함수들
binary_search(v.begin(), v.end(), 3) : 특정 값 탐색, 있으면 참 없으면 거짓
lower_bound(v.begin(), v.end(), 3) : 특정 값보다 크거나 같은 값 중 최솟값의 반복자 반환, 없으면 끝 반복자
활용 : 벡터 v에서 3보다 작은 값의 개수 찾기
lower_bound(v.begin(), v.end(), 3) - v.begin()
next_permutation(v.begin(), v.end()) : 배열을 사전 상 다음 순열로 변환. 마지막 순열일 경우 false 반환 후 첫 순열로 초기화
비교자 (compare) 함수
비교하고자 하는 자료형의 두 변수를 매개변수로 하여 불리언 값을 반환
작성 시, 왼쪽 값이 찾고자 하는 목표일 경우 true를 반환하도록 설계해야 한다.
ex) 절대값이 더 작은 원소를 찾는 비교자
//왼쪽 값이 찾고자 하는 값일 경우(절대값이 더 작을 경우)
//true를 반환한다
bool compare(int a, int b) {
return (abs(a) < abs(b));
}