넘치게 채우기
[C++] PS에 많이 쓰이는 라이브러리 및 기본 스킬들 본문
#include <bits/stdc++.h> // 모든 라이브러리 불러오기
형변환
static_cast<변환할 자료형>(값); #정적 자료형 변환. C++에서 기본으로 제공하는 자료형 안에서 형변환을 해준다.
dynamic_cast<변환할 클래스>(값); #동적 자료형 변환. 자식 클래스의 포인터/참조에서 부모 클래스의 포인터/참조로 형변환을 해준다.
reinterpret_cast<변환할 자료형>(값); #포인터 형태를 바꿔주는데, 어떤 자료형이든 가능하다. 자료형을 막 변환시킬 수 있다.
const_cast<자료형>(값); #const 성향을 없앨 수 있다.
PS에서는 static_cast만 기억하면 된다!
stoi(string) #문자열을 int로 변환시켜준다. stoi = string to int
stof = string to float
stol = string to long
stod = string to double
등등...
수학
1e9 = 10^9
2e9 = 2 * 1e9 (INT_MAX에 거의 근접한 값이다)
1e9 + 7 # 보통 온라인 저지 사이트나 알고리즘 대회에서 값이 너무 커질 때, 오버플로우를 막기 위해서 1e9 + 7로 나누라고 한다.
쓰이는 이유:
1. int 안에 들어오는 큰소수 : 소수여서 모듈러 연산의 값의 중복이 잘 없어 정확한 문제풀이가 가능하다.
2. 쉬운 표기 : 간편한 표기의 큰 소수여서 기억하기 쉽다.
3. 모듈러 곱셈 역원 : 페르마 소정리로 역원을 불러오기 좋은 수이다.
<cmath>
abs(x) # x의 절댓값을 반환한다.
sqrt(x) #루트 x의 값을 반환한다.
ceil(x) # x의 소수 첫 번째 자리를 올림한다.
floor(x) # x의 소수 첫 번째 자리를 내림한다. ++) x에 0.5를 더하고 floor(x)를 하면 반올림을 하는 것과 같다.
pow(x, y) # x^y를 반환한다. 반환 형태가 double 이므로 형변환을 해줘야 한다.
<climits>
INT_MIN # int 범위의 가장 작은 수.
INT_MAX # int 범위의 가장 큰 수.
다른 자료형들도 가능하다.
자료형 앞에 U가 붙으면 unsigned라고 보면 된다. ex)UINT_MAX = unsigned int의 최대값
LLONG은 long long이다.
<cstdlib>
rand() 무작위 수를 반환한다. 이 값에 모듈러 연산과 함께 사용해서 범위를 지정할 수 있다.
큐, 스택, 덱 자료구조
<deque>
덱 선언
deque<자료형> dq # 덱 dq를 선언.
deque dq(10) # 기본값 0이 10개 들어있는 덱 dq를 선언.
deque dq(10, 3) # 3이 10개 들어있는 덱 dq를 선언.
deque q(dq) # dq를 복사한 덱 q를 선언한다.
덱 함수
dq[index] # index번째에 있는 값 참조. 유효범위를 고려하지 않아 속도가 dq.at()보다 빠르다.
dq.at(index) #index번째에 있는 값 참조. 유효범위를 고려한다.
dq.front() # 덱 dq의 맨 앞에 있는 값 참조.
dq.back() # 덱 dq의 맨 뒤에 있는 값 참조.
dq.clear() # 덱의 모든 요소 제거.
dq.pop_front() # 덱 dq의 맨 앞의 값 제거.
dq.pop_back() # 덱 dq의 맨 뒤의 값 제거.
dq.push_front(x) # 덱 dq의 맨 앞에 값 추가.
dq.push_back(x) # 덱 dq의 맨 뒤에 값 추가.
dq.empty() # 덱 dq가 비어있으면 true 반환, 비어있지 않으면 false 반환.
<queue>
priority_queue<자료형> pq # 우선순위 큐 선언 - 기본적으로 최대 힙 사용
priority_queue<자료형, 컨테이너, 비교 함수> # 우선순위 큐 선언 - 자료형과 컨테이너, 비교 함수를 모두 정할 수 있다.
priority_queue<int, vector<int>, greater<int>> #int 우선순위 큐의 최소 힙/
pq.push(x) # x 삽입
pq.pop() # root 삭제
pq.top() # root값 참조
pq.size() # 개수 리턴
pq.empty() # 비어있으면 true, 아니면 false
문자열 처리
<string>
str[0] # 문자열 str의 0번째인덱스 참조, 유효범위 고려 x
str.at(0) # 문자열 str의 0번째인덱스 참조, 유효범위 고려
str.front() # 문자열 str의 맨 앞 참조
str.back() # 문자열 str의 맨 뒤 참조
str.length() # 문자열 str의 길이 반환 ( == str.size())
str.capacity() # 할당된 메모리 반환
str.clear() # 문자열 비우기
str.empty() # 문자열이 비어있으면 true 반환, 비어있지 않으면 false 반환. (비어있다의 기준은 길이)
str.substr(index, length) # 문자열의 인덱스부터 인덱스 + 길이 새로운 문자열 리턴
str.find(찾으려 하는 string or char, pos) # pos부터 찾으려 하는 값을 찾는다. string의 경우는 맨 앞글자의 index를 리턴한다. 없는 경우에는 -1이나 string::npos를 반환한다.
str.push_back(), str.push_front() # 문자열의 맨 뒤 또는 앞에 char 삽입
str.pop_back(), str.pop()_front() # 문자열의 맨 뒤 또는 앞의 글자 제거
str.insert(n, str) # n번째 인덱스에 str 삽입
str.erase(n, length) # n번째 인덱스부터 length만큼 삭제
stringsteram ss; # 문자열로부터 공백으로 구분된 값을 분할.
while(ss >> word){ #stringstream ss의 값을 하나씩 word에 넣음
words.push(word);
}
isalnum(char) # 영문자 또는 숫자인 경우 true 반환. 아니면 false.
isdigit(char) # 10진수인지 판별.
distance(iterator, iterator) # 두 iterator간의 거리를 반환
toupper('char') # 대문자로 변환
tolower('char') # 소문자로 변환
transform(str.begin(), str.end(), str.begin(), tolower) # 일괄 소문자변환
transform(str.begin(), str.end(), str.begin(), toupper) # 일괄 대문자변환
알고리즘 라이브러리
<algorithm>
sort(start, end) # 범위 내 요소들을 오름차순으로 정렬
sort(start, end, comp) # 사용자 정의 비교 함수를 사용하여 정렬
is_sorted(start, end, (comp)) #comp기준에 맞는 정렬이 되어있는지 판단하여 부울 값 리턴.
reverse(start, end) # 범위 내 요소들을 역순으로 정렬
max(a, b) # a와 b 중에서 큰 값 반환
min(a, b) # a와 b 중에서 작은 값 반환
max_element(start, end) # 범위 내 최댓값의 반복자 반환
min_element(start, end) # 범위 내 최솟값의 반복자 반환
find(start, end, value) # 범위 내에서 value를 검색하여 처음으로 나타나는 위치의 반복자 반환
count(start, end, value) # 범위 내에서 value의 개수를 세어 반환
binary_search(start, end, value) # 정렬된 범위 내에서 이진 탐색으로 value의 존재 여부 확인
merge(start1, end1, start2, end2, result) # 두 정렬된 범위를 병합하여 정렬된 결과를 생성
unique(start, end) # 정렬된 범위 내에서 중복된 요소 제거
next_permutation(start, end) # 범위 내의 다음 순열 생성
prev_permutation(start, end) # 범위 내의 이전 순열 생성
count_if(start, end, pred) # 범위 내에서 특정 조건을 만족하는 요소의 개수 세어 반환
upper_bound(start, end, x) # start ~ end의 범위 안에서 x보다 큰거나 같은 숫자가 언제부터 나오는지 이진탐색
lower_bound(start, end, x) # start ~ end의 범위 안에서 x보다 작거나 같은 숫자가 언제부터 나오는지 이진탐색
next_permutation(v.begin(), v.end()) # vector와 string을 인자로 받을 수 있고, 모든 순열을 구해준다. 보통 do~while문으로 쓴다.
fill(arr, arr + n, val) # arr[0] 부터 arr[n-1]까지 val로 채움
벡터
<vector>
vector<자료형> v # 벡터 v 선언
vector<자료형> v(5) # 0으로 초기화된 5개의 값을 가지는 벡터 v 선언
vector<자료형> v(5, -1) # -1로 초기화된 5개의 값을 가지는 벡터 v 선언
vector<vector<자료형> v(m, vector<자료형>(n, -1)) # -1로 초기화된 m*n의 벡터 v 선언
vector<t> v (vv.begin() + start, vv.begin() + end). #기존 벡터 vv의 구간을 복사해서 선언
vector<T> v(set.begin(), set.end()); # set to vector
v.begin() # 맨 처음 위치 접근
v.back() # 맨 마지막 요소 접근
v.end() # 맨 마지막 다음 요소 접근(끝의 끝. 그래서 범위 지정에서 .begin()부터 .end()까지 한다. --> 0-indexed의 철학을 그대로)
v[index] # 벡터 v의 index번째 요소에 접근
v.at(index) # 벡터 v의 index번째 요소에 접근 (유효 범위 체크)
v.size() # 벡터의 요소 개수 반환
v.empty() # 벡터가 비어있으면 true 반환, 비어있지 않으면 false 반환
v.capacity() # 벡터에 할당된 메모리 용량 반환
v.push_back(value) # 벡터 뒤에 요소 추가
v.pop_back() # 벡터의 마지막 요소 제거
sort(v.begin(), v.end()) # 벡터 요소들을 오름차순으로 정렬
sort(v.begin(), v.end(), comp) # 사용자 정의 비교 함수를 사용하여 정렬
reverse(v.begin(), v.end()) # 벡터 요소들을 역순으로 정렬
max_element(v.begin(), v.end()) # 벡터 내 최댓값의 반복자 반환
min_element(v.begin(), v.end()) # 벡터 내 최솟값의 반복자 반환
find(v.begin(), v.end(), value) # 벡터 내에서 value를 검색하여 처음으로 나타나는 위치의 반복자 반환
count(v.begin(), v.end(), value) # 벡터 내에서 value의 개수를 세어 반환
binary_search(v.begin(), v.end(), value) # 정렬된 벡터에서 이진 탐색으로 value의 존재 여부 확인
v.erase(unique(v.begin(), v.end()), v.end()) # 중복된 요소 제거 후 유니크한 요소들만 남김
v.erase(remove(v.begin(), v.end(), -1), v.end()) #벡터에서 -1 제거
v.erase(iterator) # 그 위치 제거
v.erase(v.begin()) # 맨 처음 제거
accumulate(v.begin(), v.end(), init) # 벡터 내의 요소들을 합산하여 초기값(init)과 더한 결과 반환
count_if(v.begin(), v.end(), pred) # 벡터 내에서 특정 조건을 만족하는 요소의 개수 세어 반환
v.insert(iterator, value) # 인덱스에 값 추가
v.insert(v.end(), v2.begin(), v2.end()) # v 뒤에 v2 붙이기.
numeric
<numeric>
accumulate(start, end, init) # 범위 내의 요소들을 합산하여 초기값(init)과 더한 결과 반환
set과 unordered_set
<set>
s.insert(x) # 값 추가
s.erase(x) # 값 제거
s.clear() # set 비우기
s.size() # 값 개수 반환
s.empty() # 비어있으면 true 반환, 비어있지 않으면 false 반환
s.find(x) # x위치 반환
set<T> s (vector.begin(), vector.end()) # 벡터를 set으로 만들기
<unordered_set>
us.insert(x) // 값 추가
us.erase(x) // 값 제거
us.clear() // unordered_set 비우기
us.size() // 값 개수 반환
us.empty() // 비어있으면 true 반환, 비어있지 않으면 false 반환
us.find(x) // x위치 반환
<unordered_ map>
unordered_map<T, T> name;um[key] = value # key에 value 저장
um.count(key) = #key값을 쓰고있는지 확인
for(const auto & num : name) { num.first #key num.second #value}
'PS > 언어별 스킬모음' 카테고리의 다른 글
[C++] unordered_map(or set)의 key로 기본 자료형이 아닌 다른 자료형 사용하기(vector, pair 등) (0) | 2023.09.08 |
---|---|
[C++] 람다 함수 (0) | 2023.09.06 |
[Java] 자바 코테의 기술 (0) | 2023.08.25 |
[Python] 파이썬 코테의 기술 (0) | 2023.08.24 |
[C++] PS에서 속도 빠르게 하는 팁 (0) | 2023.07.25 |