STL은 C++에 내장된 템플릿 기반의 라이브러리이며, 크게 컨테이너, 반복자(Iterator), 그리고 알고리즘으로 구성되어 있다!
push_back(value): 맨 뒤에 원소 추가pop_back(): 맨 뒤 원소 제거size(): 원소 개수 반환capacity(): 현재 할당된 메모리 크기reserve()로 미리 공간 확보도 가능at(index): 지정된 인덱스의 원소 반환 (범위 초과 시 예외 발생)front(): 첫 번째 원소 반환back(): 마지막 원소 반환clear(): 모든 원소 제거insert(iterator, value): 지정된 위치에 원소 삽입erase(iterator): 지정된 위치의 원소 제거data(): 내부 배열 포인터 반환벡터에 대해서는 STL 기초에서 더 자세하게 다뤘으니 거기서 확인하자.
단일 연결 리스트: 1 -> 2 -> 3 -> 4
: 3을 삭제하려면 2까지 이동해서 2의 링크를 4로 바꿔야 했다.
이중 연결 리스트: 1 <-> 2 <-> 3 <-> 4
: 3을 삭제할 때, 3의 이전(prev)과 다음(next)을 연결만 하면 됨 2 <-> 4push_back(value): 맨 뒤에 원소 추가push_front(value): 맨 앞에 원소 추가pop_back(): 맨 뒤 원소 제거pop_front(): 맨 앞 원소 제거insert(iterator, value): 지정된 위치에 원소 삽입erase(iterator): 지정된 위치의 원소 제거#include <iostream>
#include <list>
int main() {
std::list<int> lst;
// 원소 추가
lst.push_back(30);
lst.push_back(31);
lst.push_front(32);
for (int elem : lst) {
std::cout << elem << " "; // 32 30 31
}
std::cout << std::endl;
// 중간에 원소 삽입
auto it = lst.begin(); // begin은 head, rbegin은 tail처럼 동작!
++it; // 두 번째 위치로 이동
lst.insert(it, 15);
for (int elem : lst) {
std::cout << elem << " "; // 32 15 30 31
}
std::cout << std::endl;
}
push_back(value): 맨 뒤에 원소 추가push_front(value): 맨 앞에 원소 추가pop_back(): 맨 뒤 원소 제거pop_front(): 맨 앞 원소 제거at(index): 지정된 인덱스의 원소 반환 (범위 초과 시 예외 발생)front(): 첫 번째 원소 반환back(): 마지막 원소 반환clear(): 모든 원소 제거insert(iterator, value): 지정된 위치에 원소 삽입erase(iterator): 지정된 위치의 원소 제거반복자는 데이터의 집합체(예: 리스트, 튜플, 딕셔너리 등)에서 요소들을 순차적으로 접근할 수 있는 객체를 의미한다. 파이썬에서는 for 루프와 함께 자주 사용되며, 반복 가능한 객체(iterable)에서 요소를 하나씩 꺼낼 수 있도록 도와준다.
rbegin()과 rend()를 사용한다.for (std::vector<int>::reverse_iterator rit = vec.rbegin(); rit != vec.rend(); ++rit) {
std::cout << *rit << " ";
}
for (std::vector<int>::const_iterator it = vec.cbegin(); it != vec.cend(); ++it) {
std::cout << *it << " ";
}
std::vector<int> vec = {1, 2, 3};
std::vector<int> vec2 = {4, 5, 6};
// vec 뒤에 vec2를 삽입 => vec {1,2,3,4,5,6}
std::copy(vec2.begin(), vec2.end(), std::back_inserter(vec));앞에서는 소개를 하기위해 std::vector<int>::const_iterator it이런식으로 전부 선언하였지만 요즘엔 auto키워드를 사용하여
for (auto it = vec.cbegin(); it != vec.cend(); ++it) {
std::cout << *it << " ";
}
for (int val : vec) {
std::cout << val << std::endl;
}
와 같이 사용하면 된다.
sort, partial_sort, stable_sort, nth_element …find, binary_search, lower_bound, upper_bound …accumulate, inner_product, adjacent_difference …fill, replace, remove_if, unique …예시코드
#include <vector>
#include <iostream>
#include <algorithm>
#include <numeric>
using namespace std;
int main() {
vector<int> v = {5, 2, 9, 1, 7};
// 정렬
sort(v.begin(), v.end());
// 탐색
if (binary_search(v.begin(), v.end(), 9)) {
cout << "9가 벡터에 있습니다!" << endl;
}
// 누적 합
int sum = accumulate(v.begin(), v.end(), 0);
cout << "벡터 원소들의 합 = " << sum << endl; // 24
// 특정 값 치환
replace(v.begin(), v.end(), 1, 100); // 이제 1이 있던 자리가 100으로 바뀜
sum = accumulate(v.begin(), v.end(), 0);
cout << "벡터 원소들의 합2 = " << sum << endl; // 123
}
위의 코드처럼 알고리즘을 자유자재로 쓰다 보면 코딩 테스트 문제 해결 속도가 엄청나게 빨라진다.