넘치게 채우기

[C++] PS에 많이 쓰이는 라이브러리 및 기본 스킬들 본문

PS/언어별 스킬모음

[C++] PS에 많이 쓰이는 라이브러리 및 기본 스킬들

riveroverflow 2023. 5. 8. 01:50
728x90
반응형

 

#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

등등...

 

to_string # 문자열로 변환

수학

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}

 

 
 
 
 
 
 
 
 
 
 
 
 
 
728x90
반응형