template<class ForwardIt, class T>
ForwardIt remove(ForwardIt first, ForwardIt last, const T& value); // constexpr since C++20
C++17 ~
template<class ExecutionPolicy, class ForwardIt, class T>
ForwardIt remove(ExecutionPolicy&& policy, ForwardIt first, ForwardIt last, const T& value);
: 특정 값과 일치하는 요소들을 제거하는 데 사용됩니다. 실제로 컨테이너의 크기를 변경하지 않으며, 대신 제거할 요소를 뒤로 밀어넣고 새로운 "끝"을 반환합니다. 이는 물리적인 제거가 아니라 논리적인 제거임을 의미합니다.
실행 정책은 std::execution 헤더에 포함되어있습니다.
- execution::seq : 순차 실행 (기본 값)
- execution::par : 병렬 실행 (멀티코어 시스템에서 작업이 병렬로 수행됩니다.)
- execution::par_unseq : 병렬 및 비순차 실행
<example>
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
vector<int> vec = {1, 2, 3, 4, 3, 5, 3, 6, 7};
auto newEnd = remove(vec.begin(), vec.end(), 3);
cout << "Before erase : ";
for (const int & num : vec) {
cout << num << " ";
}
cout << endl;
cout << "After erase : ";
vec.erase(newEnd, vec.end());
for (const int & num : vec) {
cout << num << " ";
}
return 0;
}
결과값
erase를 하기 전 예상했던 출력 결과는 "Before erase : 1 2 4 5 6 7 3 3 3"이였는데, 실제로 출력을 해보았을 때 "Before erase : 1 2 4 5 6 7 3 6 7"이 나오는 것을 볼 수 있습니다. 즉, 3이 시작되는 곳부턴 '없는 값'으로 인식하기 때문에 복사 비용을 줄이고, 더 효율적으로 작업을 처리할 수 있기 때문에 해당 결과가 나오는 것으로 보입니다.
template<class ForwardIt, class UnaryPred>
ForwardIt remove_if(ForwardIt first, ForwardIt last, UnaryPred p); // constexpr since C++20
C++17 ~
template<class ExecutionPolicy, class ForwardIt, class UnaryPred>
ForwardIt remove_if(ExecutionPolicy&& policy, ForwardIt first, ForwardIt last, UnaryPred p);
: 주어진 조건에 맞는 요소들을 제거하는 데 사용됩니다. 마찬가지로, 컨테이너의 크기를 변경하지 않으며, 조건을 만족하는 요소들을 뒤로 밀어넣고 새로운 "끝"을 반환합니다. 즉, remove_if 역시 물리적으로 요소를 제거하는 것이 아니라 논리적으로 제거합니다.
실행 정책은 std::execution 헤더에 포함되어있습니다.
- execution::seq : 순차 실행 (기본 값)
- execution::par : 병렬 실행 (멀티코어 시스템에서 작업이 병렬로 수행됩니다.)
- execution::par_unseq : 병렬 및 비순차 실행
<example>
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
vector<int> vec = {1, 2, 3, 4, 3, 5, 3, 6, 7};
// 3으로 나눴을 때 나머지가 0인 값들을 제거합니다.
auto newEnd = remove_if(vec.begin(), vec.end(), [](int x) {return x % 3 == 0;});
vec.erase(newEnd, vec.end());
cout << "remove_if : ";
for (const int & num : vec) {
cout << num << " ";
}
return 0;
}
결과값
