C++算法 remove_copy_if()函数用于将参数[first,last)中的所有元素复制到从结果开始的参数中,除了pred返回true的那些元素而不干扰其余元素的顺序。
此函数无法更改集合的大小。
template <class InputIterator, class OutputIterator, class UnaryPredicate> OutputIterator remove_copy_if (InputIterator first, InputIterator last, OutputIterator result, UnaryPredicate pred);
first:前向迭代器,指向要从中删除元素的参数内第一个元素的位置。
last:正向迭代器,在要删除元素的参数内,将位置指向最后一个元素之后的位置。
result:一个输出迭代器,它指向要删除元素的参数的初始位置。
pred :必须替换元素的值。
指向复制参数的新结束位置(最后一个)的前向迭代器,其中包括[first,last)中的所有元素,但pred将返回true的元素除外。
让我们看一个简单的示例,以演示remove_copy_if()的用法:
链接:https://www.learnfk.comhttps://www.learnfk.com/c++/cpp-algorithm-remove-copy-if-function.html
来源:LearnFk无涯教程网
#include <algorithm> #include <iostream> #include <vector> #include <iterator> using namespace std; int main() { vector<int> v = { 2,1,3,4,5,7,6,9,8}; remove_copy_if(v.begin(), v.end(), ostream_iterator<int>(cout, ","), [](int x) { return x%2 != 0; }); return 0; }
输出:
2,4,6,8,
让我们看另一个简单的例子:
#include <vector> #include <algorithm> #include <iostream> using namespace std; bool IsOdd(int i) { return ((i % 2) != 0); } // Function to remove from v1 result vector is v2 void remove_copy_ifDemo(vector <int> &v1, vector<int> &v2) { remove_copy_if(v1.begin(), v1.end(), v2.begin(), IsOdd); } // Function to print content of vector void print(vector<int>&v) { int len = v.size(); for (int i = 0; i < len; i++) cout << v[i] << " "; cout << endl; } int main() { //declare vector v1, v2 vector <int> v1, v2(10); //push data in vector for(int i = 10; i <= 20; i++) v1.push_back(i); cout << "elements of v1 before remove_copy: "; print(v1); remove_copy_ifDemo(v1,v2); cout << "elements of v1 after remove_copy: "; print(v1); cout << "After removing Odd Numbers from v1" " copy result in vector v2" <<endl; print(v2); return 0; }
输出:
elements of v1 before remove_copy: 10 11 12 13 14 15 16 17 18 19 20 elements of v1 after remove_copy: 10 11 12 13 14 15 16 17 18 19 20 After removing Odd Numbers from v1 copy result in vector v2 10 12 14 16 18 20 0 0 0 0
让我们看另一个简单的例子:
#include <iostream> #include <vector> #include <algorithm> #include <functional> using namespace std; int main() { const int MAX_ELEMENTS = 8 ; //Define a template class vector of integers typedef vector<int > IntVector ; //Define an iterator for template class vector of integer typedef IntVector::iterator IntVectorIt ; //vector containing numbers IntVector Numbers(MAX_ELEMENTS), Result(MAX_ELEMENTS) ; IntVectorIt start, end, it, last, resultIt ; //Initialize vector Numbers Numbers[0] = 10 ; Numbers[1] = 20 ; Numbers[2] = 10 ; Numbers[3] = 15 ; Numbers[4] = 12 ; Numbers[5] = 25 ; Numbers[6] = 30 ; Numbers[7] = 10 ; start = Numbers.begin() ; //location of first //element of Numbers end = Numbers.end() ; //one past the location //last element of Numbers resultIt = Result.begin() ;//location of first //element of Result //print content of Numbers cout << "Numbers { " ; for(it = start; it != end; it++) cout << *it << " " ; cout << " }\n" << endl ; //copy all elements from Numbers to Result //skipping any item that >= 25 last = remove_copy_if(start, end, resultIt, bind2nd(greater_equal<int>(), 25)) ; //print number of elements copied to Result cout << "Total number of elements copied to Result = " << last - resultIt << endl ; start = Result.begin() ; //location of first //element of Result end = Result.end() ; //one past the location //last element of Result //print content of Result cout << "Result { " ; for(it = start; it != end; it++) cout << *it << " " ; cout << " }\n" << endl ; return 0; }
输出:
Numbers { 10 20 10 15 12 25 30 10 } Total number of elements copied to Result = 6 Result { 10 20 10 15 12 10 0 0 }
让我们看另一个简单的例子:
#include <vector> #include <algorithm> #include <iostream> using namespace std; bool greathan(int value) { return value >7;} int main(void) { // vector container vector <int> vec1, vec2(14); // vector iterator vector <int>::iterator Iter1, Iter2, new_end; int i, j; // push data in range for(i = 0; i <= 10; i++) vec1.push_back(i); for(j = 0; j <= 2; j++) vec1.push_back(5); // print the data cout<<"The original vec1 vector data: "; for(Iter1 = vec1.begin(); Iter1 != vec1.end(); Iter1++) cout<<*Iter1<<" "; cout<<endl; // randomly shuffle the data random_shuffle(vec1.begin(), vec1.end()); cout<<"\nThe original vec1 vector data randomly shuffled: "; for(Iter1 = vec1.begin(); Iter1 != vec1.end(); Iter1++) cout<<*Iter1<<" "; cout<<endl; // remove elements with a value greater than 7 new_end = remove_copy_if(vec1.begin(), vec1.end(), vec2.begin(), greathan); cout<<"\nAfter the remove_copy_if() operation, the vec1 vector is left unchanged as: "; for(Iter1 = vec1.begin(); Iter1 != vec1.end(); Iter1++) cout<<*Iter1<<" "; cout<<endl; cout<<"\nvec2 vector is a copy of vec1 vector with values greater than 7 removed: "; for(Iter2 = vec2.begin(); Iter2 != new_end; Iter2++) cout<<*Iter2<<" "; cout<<endl; return 0; }
输出:
The original vec1 vector data: 0 1 2 3 4 5 6 7 8 9 10 5 5 5 The original vec1 vector data randomly shuffled: 4 10 5 5 0 5 5 1 6 9 3 7 8 2 After the remove_copy_if() operation, the vec1 vector is left unchanged as: 4 10 5 5 0 5 5 1 6 9 3 7 8 2 vec2 vector is a copy of vec1 vector with values greater than 7 removed: 4 5 5 0 5 5 1 6 3 7 2
祝学习愉快!(内容编辑有误?请选中要编辑内容 -> 右键 -> 修改 -> 提交!)
HarmonyOS快速入门与实战 -〔QCon+案例研习社〕