프로그래밍에 도움이 되는 여러 작업을 쉽게할 수 있도록 도와주는 라이브러리로 주로 정렬알고리즘이나 컨테이너 관련 작업들이 있다.
template <typename Iter>
void do_something(Iter begin, Iter end);
template <typename Iter, typename Pred>
void do_something(Iter begin, Iter end, Pred pred)
O(nlogn)
O(n(logn)^2)
remove
: erase를 사용해 하나씩 삭제하기 힘들었던 작업을 편하게 수행 가능remove_if
: 세번째 인자로 조건을 설명할 함수 객체를 전달 받음이름이 없는 함수
[capture list](받는 인자)->리턴 타입{함수 본체}
int i
를 받고, bool
을 리턴하는 람다 함수[](int i) -> bool { return i % 2 == 1; }
[](int i) { return i % 2 == 1; }
auto func = [](int i) { return i % 2 == 1; };
func(4); // false;
vec.erase(std::remove_if(vec.begin(), vec.end(),
[&num_erased](int i) { //캡쳐목록으로 num_erased사용
if (num_erased >= 2)
return false;
else if (i % 2 == 1) {
num_erased++;
return true;
}
return false;
}),
vec.end());
this
를 전달vec.erase(std::remove_if(vec.begin(), vec.end(),
[this](int i) {
if (this->num_erased >= 2)
return false;
else if (i % 2 == 1) {
this->num_erased++;
return true;
}
return false;
}),
vec.end());
remove와 마찬가지로 한번에 원하는 원소들의 값을 변경할 수 있다.
transform (시작 반복자, 끝 반복자, 결과를 저장할 컨테이너의 시작 반복자, Pred)
결과를 저장할 컨테이너는 원래 크기의 컨테이너보다 최소한 같거나 커야함
예시
#include <algorithm>
#include <functional>
#include <iostream>
#include <string>
#include <vector>
template <typename Iter>
void print(Iter begin, Iter end) {
while (begin != end) {
std::cout << "[" << *begin << "] ";
begin++;
}
std::cout << std::endl;
}
int main() {
std::vector<int> vec;
vec.push_back(5);
vec.push_back(3);
vec.push_back(1);
vec.push_back(2);
vec.push_back(3);
vec.push_back(4);
std::cout << "처음 vec 상태 ------" << std::endl;
print(vec.begin(), vec.end());
std::cout << "벡터 전체에 1 을 더한다" << std::endl;
std::transform(vec.begin(), vec.end(), vec.begin(),
[](int i) { return i + 1; });
print(vec.begin(), vec.end());
}