그런 기능을 수행한다.
#include <algorithm>
#include <iostream>
#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(6);
vec.push_back(4);
vec.push_back(7);
vec.push_back(2);
std::cout << "Before Sorting ----" << std::endl;
print(vec.begin(), vec.end());
std::sort(vec.begin(), vec.end());
std::cout << "After Sorting ----" << std::endl;
print(vec.begin(), vec.end());
}
sort는 begin(), end()를 인자로 받아서 작동하는데, 리스트는 이렇게 정렬 할 수 없다. 이는 sort의 반복자가 임의접근 반복자(RandomAccessIteraotr를 만족해야하기 때문이다.)
부분정렬은
std::partial_sort(start, middle, end);
총 3개의 인자를 받는다. start 에서 end 까지중, middle까지만 정렬한다는 의미이다.
물론 erase로 지우는것을 이미 알고있지만, 이는 모든 1을 지우시오같은 조건문을 수행하기는 조금 어렵다.
물론 이러한 조건도 itr을 통한 삭제, 혹은 배열처럼 접근해서 삭제를 구현할 수는 있지만, 이는 제약조건이 따른다.
하지만 remove를 쓴다면 모든게 간편해진다.
std::remove(start, end, val)
위과 같은 구조를 가지는 remove이다.
혹은 remove_if 를 통해 조건삭제를 할 수 있다.
std::remove(start, condition, end)
// ex
// std::remove(vec.begin(), is_even(), vec.end())
위와 같은 구조를 가지고있다.
순회하면서조건에 따라 값을 바꾸는 기능을 수행한다.
transform (시작 반복자, 끝 반복자, 결과를 저장할 컨테이너의 시작 반복자, Pred)
위와 같은 구조를 가지고 있다.
transform(vec.begin(), vec.end(), vec.begin(), [](int i) { return i + 1; });
이 예시를 보면, begin 부터 end까지의 vec에서, 각 원소에 i + 1 을 한 결과를 반환한다는 의미이다.
auto result = std::find(vec.begin(), vec.end(), 3);
std::find_if(current, vec.end(), [](int i) { return i % 3 == 2; });
find_if는 함수객체를 인자로 받아 참인 경우에 실행한다.
// 파티원 모두가 15 레벨 이상이여야지 던전 입장 가능
bool can_join_dungeon() {
return std::all_of(users.begin(), users.end(),
[](User& user) { return user.level >= 15; });
}
// 파티원 중 한명 이라도 19렙 이상이면 특별 아이템 사용 가능
bool can_use_special_item() {
return std::any_of(users.begin(), users.end(),
[](User& user) { return user.level >= 19; });
}
조건이 전체만족일경우 all_of,
부분만족일경우 any_of이다.