[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