STL

김민석·2021년 2월 8일
1

1. String

배열처럼 인덱스로 접근 가능
c언어의 char* 과는 달리 맨 뒤에 널값 없음

헤더파일
"string"

선언
string str; / str = "asdfsdf";
string str("abcde");
string str(str1);

입력
cin >> str; -> 띄어쓰기 인식 못함
getline(cin,str); -> 띄어쓰기 포함 문자열

출력
cout << str;

함수
인자접근 관련
str.at(index); -> 인덱스에 있는 문자 반환
str[]; -> 인덱스에 있는 문자 반환
str.front(); -> 맨 앞 문자 반환
str.back(); -> 맨 뒤 문자 반환

길이, 크기 관련
str.size(); -> 문자열 크기(길이) 반환
str.length(); -> 문자열 길이(크기) 반환 (=str.size())
str.resize(n); -> 문자열을 n크기로 만듬 / n보다 작으면 빈칸으로 채움, n보다 크면 n뒤로 짜름
str.resize(n,'c'); -> 남은 공간을 'c'로 채움
str.empty(); -> 문자열 비어있는지 확인(비었으면 true 반환)

문자열 다루기
str.substr(n); -> n번째 인덱스 문자열 부터 끝까지 반환
str.substr(n,m); -> n번째 부터 m길이 만큼 문자열 반환
str.replace(n,m,str1); -> n번째 부터 m개를 str1으로 대체 (ex (0,1,str)이면 0번째 문자만 str로 대체)
str1.compare(str2); -> str1과 str2 비교(str1이 더 작으면 음수 반환)
str1.find(str2); -> str1에 str2있는지 확인(있으면 일치하는 첫번째 인덱스 반환)
str.push_back('c'); -> 문자열 맨 뒤에 문자 'c'추가
str.pop_back(); -> 문자열 맨 뒤 문자 pop

iterator
str.begin(); -> 첫번째 문자를 가리키는 포인터 반환
str.end(); -> 마지막 바로 다음을 가리키는 포인터 반환

기타
swap(str1,str2); -> str1랑 str2 바꿈
str1 += str2; -> str1이랑 str2 합쳐짐
to_string(int...); -> 숫자를 문자열로 변환
stoi(); -> 문자열을 int로 변환

2. vector

자동으로 메모리가 할당되는 배열
인덱스로 접근 가능
벡터 끼리 대소비교, 일치여부 파악 가능(==, !=, <, >, <=, >=)

헤더파일
"vector"

선언
vector<> v; -> 비어있는 벡터 생성
vector<> v(n); -> 0으로 초기화 된 n개의 원소를 갖는 벡터 생성
vector<> v(n,m); -> m으로 초기화 된 n개의 원소를 갖는 벡터 생성
vector<> v2(v1); -> v1을 복사하여 v2생성

함수
v.at(index); -> 인덱스에 있는 벡터 원소 반환
v[]; -> 인덱스에 있는 벡터 원소 반환
v.front(); -> 벡터의 첫 원소 반환
v.back(); -> 벡터의 마지막 원소 반환
v.clear(); -> 모든 원소 제거(메모리는 남아 있음, 사이즈는 줄어들지만 용량은 그대로라는뜻)
v.push_back(); -> 맨 뒤에 원소 삽입
v.pop_back(); -> 맨 뒤 원소 pop
v.begin(); -> 첫 원소 가리킴(front와는 다름, 포인터 역할, 주소 반환)
v.end(); -> 마지막 원소의 다음 가리킴(포인터 역할, 주소 반환)
v.resize(n); -> 크기 n으로 변경(더 커지면 기본값(0)으로 초기화)
v.resize(n,3); -> 크기 n으로 변경(더 커지면 3으로 초기화)
v.size(); -> 원소 개수
v1.swap(v2); -> v1과 v2 바꿔줌
v.insert(x,y,z); -> x번째 위치에 y개의 z 삽입(뒤에꺼는 뒤로 밀림),삽입할위치 iterator 사용해야함
v.insert(n,m); -> n번째 위치에 m삽입(삽입한 곳의 위치 반환), iterator사용해야함

v.erase(iter); -> iter가 가리키는 원소 제거(사이즈도 줄어듬)
v.erase(iter1, iter2); -> iter1 부터 iter2직전 까지 지움
v.empty(); -> 비었으면 true 반환

추가
vector<vector> v; -> 2차원 벡터 생성
vector<vector> v(n, vector(m,0)); -> nxm 벡터 선언하고 0으로 초기화
v1.push_back(v2); -> 2차원 벡터에 벡터 자체 삽입
v1[].push_back(); -> 2차원 벡터 인덱스에 원소 추가

3.deque

동적 배열로 인덱스를 통한 접근이 가능하다.

헤더파일
"deque"

선언
deque<> dq;

함수
dq.push_front(); -> 맨 앞에 원소 삽입
dq.push_back(); -> 맨 뒤에 원소 삽입
dq.pop_front(); -> 맨 앞 원소 삭제
dq.pop_back(); -> 맨 뒤 원소 삭제
나머지는 벡터와 동일

4. stack

헤더파일
"stack"

선언
stack<> s;

함수
s.empty(); -> 비었는지 확인
s.size(); -> 크기 반환
s.top(); -> 맨 위 원소 반환
s.push(); -> 값 삽입
s.pop(); -> 맨 위 원소 삭제

5. queue, priority_queue

헤더파일
"queue"

선언
queue<> q;
priority_queue<> pq;

함수
q.front(); -> 첫번째 원소
q.back(); -> 맨 뒤 원소
q.empty(); -> 비어있는지 확인(비어있으면 1 아니면 0)
q.size(); -> 원소의 개수(크기) 반환
q.push(); -> 맨 뒤에 값 삽입
q.pop(); -> 맨 앞 값 삭제

6. pair

두 객체를 하나로 취급할 수 있도록 묶어준다.
데이터 쌍을 표현할 때 사용한다.
첫번째 인자 first, 두번째 인자 second로 구분한다.
연산자 사용 가능(==, !=, <, >, <=, >=)
sort 알고리즘으로 정렬 가능(첫번째 인자로 비교하다가 첫번째 인자가 같으면 두번째 인자 비교)

헤더파일
"utility"

선언
pair<int, int> p;

함수
p.first; -> 첫번재 인자 반환
p.second; -> 두번째 인자 반환
p = make_pair(n,m); -> n과 m이 들어간 pair 생성
-> p = {4, 5}; 로도 사용 가능

벡터에서 사용하는 경우
vector<pair<int, string>> v;
v.push_back(make_pair(10,"wqer")); -> v.push_back(pair<int, string>(10,"wqer"));

7. set, multiset

균형잡힌 이진트리로 원소 삽입, 삭제, 탐색 등의 연산은 O(logn)을 보장한다.
key의 집합으로 이루어진 컨테이너
key는 중복이 허용되지 않는다.(같은 값 삽입되면 하나만 저장됨)
-> multiset은 key 중복 허용
원소 삽입 되면 자동 정렬된다. 기본 정렬 기준은 오름차순이다.
연산자 사용 가능(==, !=, <, >, <=, >=)

헤더파일
"set"

선언
set<> s;
set<> s(pred); -> pred를 통해 정렬 기준 세움
set<pair<int, string>> s;

multiset<> ms;
multiset<vector> ms;

함수
s.begin(); -> 첫 원소를 가리키는 반복자 리턴(포인터)
s.end(); -> 마지막 원소 포인터
s.clear(); -> 모든 원소 제거
s.count(k); -> 원소 k의 개수 반환(중복 허용 안하니까 무조건 0또는 1)
s.empty(); -> 비어있는지 확인
s.insert(k); -> 원소k 삽입, 자동 정렬됨(성공 여부 pair로 반환<삽입원소, 실패여부>)
->multiset에서는 중복 허용하니까 삽입 원소 위치 반복자 반환
s.erase(iter); -> iter가 가리키는 원소 제거, 제거 후 다음 원소의 포인터 반환
s.erase(siter, eiter); -> s부터 e직전까지 원소 제거
s.find(k); -> k가 존재하는 곳의 반복자(포인터) 반환, 없으면 s.end() 리턴
s.size(); -> 원소 개수 반환

8. map, multimap

key와 value가 같이 저장되는 자료구조
key는 고유값으로 중복 불가
-> multimap은 허용
자동으로 정렬됨(오름차순)
set구조에 value 들어있는 느낌?
연산자 사용 가능(==, !=, >, <, <=, >=)
[]연산자 사용 가능( m[key] = val; 을 통해 원소(key,value)를 추가 또는 수정 가능)
-> multimap에서는 []연산자 사용 불가
삽입, 탐색, 삭제 연산 O(logn) 보장

헤더파일
"map"

선언
map<int,int> m1;
map<string, int> m2;

multimap<int, int> mm;

함수
m.insert(pair<int, int>(10,20)); -> m.insert(make_pair(10,20));
m.insert(pair<string, int>("asdf",20)); -> m.insert(make_pair("asdfg",20));
-> map에 삽입하려면 pair 객체를 인자로 받아야 함
-> pair 쓰기 때문에 iter->first나 (* iter).first 로 접근해야함
-> first는 key, second는 value

나머지 set과 동일

8.1 unordered_map

map 처럼 key와 value를 사용하지만 tree를 이용하여 정렬하는 것이 아니라 hash_table 기반의 hash_container 이다.
이때문에 삽입, 삭제, 탐색 시 O(1)이 걸린다.
데이터의 양이 클 때 map보다 효율이 좋다.

헤더파일
"unordered_map"

선언
unordered_map<> um;

함수
map과 동일

9. algorithm

여러가지 알고리즘 들어 있음
보통 벡터나 배열에서 사용하는듯

헤더파일
"algorithm"

함수
max(m,n), min(m,n) -> 두 원소중 큰 값, 작은값을 반환

max_element(), min_element() -> 배열이나 벡터 안에서 가장 큰, 가장 작은값의 주소 반환
-> *max_element(arr1.begin(), arr1.end()); -> *max_element(arr2,arr2+size);
-> 시작 지점과 끝 지점은 포인터로 지정 가능(arr1.begin()+3이나 arr2+3 이런식)

swap(m,n); -> m과 n을 바꿔줌

reverse(siter, eiter); -> 시작점부터 끝점 구간 뒤집어줌, 벡터, 배열 다 가능
->reverse(a, a+size); -> 시작부터 끝까지 뒤집어줌
-> 포인터로 지정 가능(a.begin()+1이나 a+1 이런식)

sort(siter, eiter); -> 정렬기능, stable_sort()도 똑같음
-> sort(arr1.begin(), arr1.end()); -> sort(arr2, arr2+size);
-> 비교함수도 만들어서 같이 넘겨줄 수 있음 sort(arr2, arr2+size, cmp);

arr1.erase(unique(arr1.begin(), arr1.end()), arr1.end()); -> 벡터 중복원소 제거
-> 정렬 되어 있어야 한다.
-> unique는 중복 원소들을 구간 뒤로 밀어내고 쓰레기 값의 시작 주소를 반환한다.
-> 보통 erase와 함께 중복 원소 제거 방법으로 사용된다.

lower_bound(siter, eiter, n); -> n이상이 처음으로 등장하는 포인터 반환
-> 없으면 맨 마지막 원소 +1 위치 포인터 반환(arr+size나 arr.end())
-> 포인터 반환하기 때문에 int idx = lower_bound(arr, arr+10, 5) - arr로 인덱스 구할수 있음
-> vector::iterator iter = lower_bound(arr.begin(), arr.end(), 5) - arr.begin() -> * iter로 인덱스 표현 가능

upper_bound() -> lower_bound와 사용법 같음
-> 초과값이 처음으로 나오는 위치 포인터 반환
-> lower_bound와 upper_bound 둘 다 이진탐색 기반 탐색법

참고 사이트

개발자 지망생
https://blockdmask.tistory.com/

박트리
https://baactree.tistory.com/category

profile
김민석의 학습 정리 블로그

0개의 댓글