[C++] - STL 정리
STL(Standard Template Library)
- C++의 템플릿을 사용하여 표준으로 정리된 라이브러리
- 반복자 / 컨테이너 / 알고리즘 함수객체 등 라이브러리로 구성
컨테이너(Container)
- 시퀀스 컨테이너 : 일반적인 자료구조와 동일 (vector / list / string / deque …)
- 연관 컨테이너 : 일정한 규칙에 따라 자료를 저장 (set / map / multiset / multimap)
- 어댑터 컨테이너 : 시퀀스 컨테이너를 변형시켜 저장 (queue / stack / priority queue)
1. vector
특징
- 동적배열
- 데이터 추가/삭제는 빠르다. 하지만 중간에 삽입은 느리다.
- 벡터는 순차 추가/삭제에 강한로직에 쓰인다.
#include <iostream>
#include <vector>
using namespace std;
int main(){
vector<int> v1; //int 자료형 선언
vector<node> v2; //따로 정의한 구조체 선언
vector<int> v3(n); //크기를 n으로 지정
vector<int> v4(n, 2); //크기를 n으로, 1로 초기화
vector<vector<int>> v5(n, vecotr<int>(m, 0)); // n*m인 2차원배열, 0으로 초기화
v1.push_back(5); // 벡터 마지막에 원소(5) 추가
v1.pop_back(); // 벡터 맨뒤 원소 삭제
v1.size(); // 벡터 크기
v1.resize(n); // 벡터 크기 n으로 재설정
v1.clear(); // 벡터 모든 원소 삭제
v1.begin(); // 벡터의 첫 원소 주소 리턴
v1.end(); // 벡터의 마지막 원소 주소 리턴
v1.erase(v1.begin(), v1.end()); // 모든 원소 삭제
vector<int> v5 = vector<int>(v1.begin() + 3, v1.end()); // 3번쨰 원소부터 마지막 원소까지 복사 생성
}
//2차원백터 다루기
vector<vector<int>> solution(vector<int> num_list, int n) {
vector<vector<int>> answer;
for (int i = 0; i < num_list.size() / n; i++) {
vector<int> v;
for (int j = 0; j < n; j++) {
v.push_back(num_list[i * n + j]);
}
answer.push_back(v);
}
return answer;
}
2. stack
#include <iostream>
#include <stack>
using namespace std;
int main(){
stack<int> st; // int 자료형 스택 생성
st.push(4); // 원소 삽입
st.pop(); // 맨위 원소 값 꺼내기
st.top(); // 맨위 원소 값 출력
st.empty(); // 비어있으면 1 아니면 0
st.size(); // 스택 크기 출력
}
3. queue
#include <iostream>
#include <queue>
using namespace std;
int main(){
queue<int> q; // int자료형 큐 생성
q.push(3); // 원소 삽입
q.pop(); // 맨위 원소 꺼내기
q.front(); // 맨위 원소 출력
q.empty(); // 비어있으면 1 아니면 0
q.size(); // 큐 크기 출력
}
4. list
#include <list>
using namespace std;
int main(){
list<int> l; // int자료형 리스트 생성
auto iter = l.begin(); // l리스트의 첫주소 반환
iter = l.end(); // l리스트의 마지막+1 주소 반환
l.push_front(4); // 리스트 처음에 원소 추가
l.push_back(3); // 마지막에 원소 추가
l.pop_front(); // 처음원소 제거
l.pop_back(); // 마지막원소 제거
l.insert(iter, 3); // iter가 가리키는 부분 '앞'에 원소 추가
l.erase(iter); // iter가 가리키는 부분 원소 삭제
*iter; // iterator가 가리키는 원소 접근
l.front(); // 첫번째 원소 반환
l.back(); // 마지막 원소 반환
l.empty(); // 비어있으면 true, 아니면 false 반환
l.size(); // 리스트의 크기 반
}
c++ TIP
-
java랑 비슷한것 같다.
-
stl은 내가 쓴 함수들이 void리턴인 경우가 많다.
- cout의
endl;
대신"\n"
개행으로 하는게 효율적이다. 이거 하나로 코테 시간초과 나는 경우가 있다. -
endl
는 개행만 하는것이 아니라 내부 버퍼를 비워주는 역할도 하기 때문이다. cin.tie(nullptr);
ios::sync_with_stdio(false)
작성시 입출력 시간을 줄일 수 있다.- 링크 https://velog.io/@d2h10s/c-iossyncwithstdio%EB%9E%80