📌 목차이 글은 C++의 STL을 공부한 내용을 정리한 내용입니다. 잘 정리하여 추후 복습에 도움을 얻기 위해 작성하였습니다.
STL은 C++에 내장된 템플릿 기반의 라이브러리로 컨테이너(Container), 반복자(Iterator) 그리고 알고리즘(Algorithm)으로 구성되어 있다.
STL을 잘 파악하고 있다 -> 코딩 테스트에 빠르게 적용하여 문제를 해결할 수 있다!
리스트
vector는 동적 배열이라고 생각하면 된다. 배열이기 때문에 연속적인 메모리 블록을 사용하여 랜덤 접근이 빠르다. 하지만 동적 배열의 특성 상 마지막 원소를 추가/제거하는 것은 유리하지만 중간에 데이터를 삽입/제거 하는 것은 많은 비용이 들 수 있다(데이터 단체 이동!).
#include <iostream>
#include <vector>
int main() {
std::vector<int>
// 원소 추가
v.push_back(1);
v.push_back(9);
// 마지막 원소 제거
v.pop_back();
// 첫 번째 원소 접근
std::cout << "처음: " << v.front() << std::endl; // 1
// 중간에 원소 삽입
v.insert(v.begin() + 1, 3); // 1, 3
// 원소 제거 (두 번째 원소 삭제)
v.erase(v.begin() + 1); // 1만 남음
// 결과 출력
std::cout << "최종 크기: " << v.size() << std::endl;
std::cout << "첫 번째 원소: " << v.front() << std::endl;
return 0;
}
list는 이중 링크드 리스트를 구현한 것이다. 데이터의 앞 뒤 정보를 가지고 있기 때문에 데이터 중간 삽입이 유리하다. 하지만 데이터를 접근하기 위해서는 처음부터 순회해야 하기 때문에 랜덤 접근이 느리다.
#include <iostream>
#include <list>
int main() {
std::list<int> lst;
// 원소 추가
lst.push_back(10);
lst.push_back(20);
lst.push_front(30); // 30 10 20
// 중간에 원소 삽입
auto it = lst.begin(); // begin은 head, rbegin은 tail처럼 동작!
++it; // 두 번째 위치로 이동
lst.insert(it, 15); // 30 15 10 20
}
deque는 양방향 동적 배열이다. 데이터를 양쪽 끝에서 추가/삭제 하는 데 용이하여 스택이나 큐를 구현할 때 사용하기 좋다. 역시 배열이므로 중간에서 삽입/삭제가 비효율적이다.
#include <iostream>
#include <deque>
int main() {
std::deque<int> dq;
// 원소 추가
dq.push_back(20);
dq.push_back(30);
dq.push_front(10); // 10 20 30
// 맨 앞 원소 제거
dq.pop_front(); // 20 30
// 맨 뒤 원소 제거
dq.pop_back(); // 20
// 결과 출력
std::cout << "첫 번째 원소: " << dq.front() << std::endl;
std::cout << "데크의 크기: " << dq.size() << std::endl;
return 0;
}
#include #includeint main() {
std::deque dq;// 원소 추가 dq.push_back(20); dq.push_back(30); dq.push_front(10); // 10 20 30 // 맨 앞 원소 제거 dq.pop_front(); // 20 30 // 맨 뒤 원소 제거 dq.pop_back(); // 20 // 결과 출력 std::cout << "첫 번째 원소: " << dq.front() << std::endl; std::cout << "데크의 크기: " << dq.size() << std::endl; return 0;
}
map은 key-value를 pair로 가지는 컨테이너이다. 각 원소의 key 값은 중복을 허용하지 않는 유일한 값이고 자동으로 정렬된다. 레드-블랙 트리로 구현되어 있다.
end() 리턴!