반응형
#include <algorithm>
- 컨테이너에 반복자들을 가지고 이런 저런 작업을 쉽게 수행할 수 있도록 도와주는 라이브러리.
- 보통 다음의 두 형태를 가집니다.
- 반복자의 시작점과 끝점 바로 뒤를 받는 경우
- 반복자의 시작점과 끝점 바로 뒤 + 서술자(Predicate): 특정한 조건을 서술
template <typename Iter>
void do_something(Iter begin, Iter end);
template <typename Iter, typename Pred>
void do_something(Iter begin, Iter end, Pred pred)
정렬 (sort, stable_sort, partial_sort)
- sort : 일반적인 정렬 함수이며, hybrid of QuickSort를 이용하여 구현되었습니다.
std::sort(vec.begin(), vec.end(), greater<int>());
- stable_sort : 정렬을 하되 원소들 간의 순서를 보존합니다.
이 말이 무슨 말이냐면, 만약에 벡터에 [a, b] 순으로 있었는데, a 와 b 가 크기가 같다면 정렬을 [a,b] 혹은 [b,a] 로 할 수 있습니다. - partial_sort : 배열의 일부분만 정렬합니다 (아래 자세히 설명하겠습니다)
정렬을 [stard, end) 전체 원소들 중에서 [start, middle) 까지 원소들이 전체 원소들 중에서 제일 작은애들 순으로 정렬 시킵니다.
std::partial_sort(start, middle, end)
원소 제거 (remove, remove_if)
- 이미 대부분의 컨테이너에서는 원소를 제거하는 함수를 지원하고 있습니다.
- remove: 값이 3 인 원소들 제거
vec.erase(remove(vec.begin(), vec.end(), 3), vec.end());
- remove_if: 특정 조건을 만족하는 원소들 제거
struct is_odd {
bool operator()(const int& i) { return i % 2 == 1; }
};
vec.erase(remove_if(vec.begin(), vec.end(), is_odd()), vec.end());
- remove_if (람다함수): 람다함수 활용
vec.erase(std::remove_if(vec.begin(), vec.end(), [](int i) -> bool { return i % 2 == 1; }),
vec.end());
- remove_if 응용: 특정 조건을 만족하는 원소 n개 제거
struct is_odd {
int* num_delete;
is_odd(int* num_delete) : num_delete(num_delete) {}
bool operator()(const int& i) {
if (*num_delete >= 2) return false;
if (i % 2 == 1) {
(*num_delete)++;
return true;
}
return false;
}
};
int num_delete = 0;
vec.erase(std::remove_if(vec.begin(), vec.end(), is_odd(&num_delete)), vec.end());
- remove_if 응용 (람다함수): 특정 조건을 만족하는 원소 n개 제거
int num_erased = 0;
vec.erase(std::remove_if(vec.begin(), vec.end(),
[&num_erased](int i) {
if (num_erased >= 2)
return false;
else if (i % 2 == 1) {
num_erased++;
return true;
}
return false;}),
vec.end());
원소 수정하기 (transform)
- vec 의 처음 부터 끝 까지 읽으면서 1 씩 더한 결과를 vec2 에 저장
std::transform(vec.begin(), vec.end(), vec2.begin(), [](int i) { return i + 1; });
참고
- [씹어먹는 C++] C++ STL - 알고리즘(algorithm): https://modoocode.com/225
- [씹어먹는 C++] algorithm 라이브러리: https://modoocode.com/256
반응형
'Study: Software(SW) > SW: Language' 카테고리의 다른 글
[C++] 병행 컴퓨팅: concurrency, thread... (0) | 2022.06.16 |
---|---|
[C++] 초심자가 자주 하는 C++ 실수 (0) | 2022.06.15 |
[C++] 템플릿 메타 프로그래밍 (Template Meta-programming) (0) | 2022.06.14 |
[C++] 템플릿 (Template) (feat. Template Meta-programming) (0) | 2022.06.14 |
[C++] 객체지향 프로그래밍: 추상화, 캡슐화, 상속성, 다형성, 동적바인딩... (0) | 2022.06.13 |