C++算法 replace_copy_if()函数用于将参数[first,last)复制到从结果开始的参数,并按new_value放置 pred 返回true的参数。它使用谓词 pred 而不是operator ==来比较元素。
此函数检查源参数中的每个元素,如果将结果复制到新的目标参数中,则如果满足指定谓词,则将其替换。
replace_copy_if - 语法
template <class InputIterator, class OutputIterator, class UnaryPredicate, class T> OutputIterator replace_copy_if (InputIterator first, InputIterator last, OutputIterator result, UnaryPredicate pred, const T& new_value);
replace_copy_if - 参数
first:一个输入迭代器,该迭代器指向要替换元素的参数内的初始位置。
last:一个输入迭代器,它指向要替换元素的参数内的最终位置。
result:一个输出迭代器,指向存储结果序列的参数的第一个元素。
pred :如果要替换元素的值,则必须满足一元谓词。
old_value :要替换的元素的旧值。
new_value :分配给具有旧值的元素的新值。
replace_copy_if - 返回值
replace_copy_if()函数返回一个输出迭代器,该迭代器指向在结果序列中写入的最后一个元素的位置。
replace_copy_if - 例子1
让我们看一个简单的示例,以演示replace_copy_if()的用法:
#include <algorithm> #include <iostream> #include <vector> #include <iterator> using namespace std; int main() { vector<int> v = { 3,1,2,1,2 }; replace_copy_if(v.begin(), v.end(), ostream_iterator<int>(cout, ","), [](int x) { return x%2 != 0; }, 10); return 0; }
输出:
10,10,2,10,2,
replace_copy_if - 例子2
让我们看另一个简单的例子:
// CPP code to illustrate // replace_copy_if #include <iostream> #include <algorithm> #include <vector> using namespace std; // Function to check if number is even int IsEven(int i) { return ((i % 2) == 0); } // 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; } // Function to replace all even numbers from vector v1 and // copying them to v2 void replace_copy_ifDemo(vector<int>& v1, vector<int>& v2) { replace_copy_if(v1.begin(), v1.end(), v2.begin(), IsEven, 0); } // Driver Code int main() { vector<int> v1, v2; for (int i = 1; i <= 10; i++) v1.push_back(i); cout << "Before replace_copy_if: "; print(v1); v2.resize(v1.size());//allocate space replace_copy_ifDemo(v1, v2); cout << "After replace_copy_if: "; print(v2); return 0; }
输出:
Before replace_copy_if: 1 2 3 4 5 6 7 8 9 10 After replace_copy_if: 1 0 3 0 5 0 7 0 9 0
replace_copy_if - 例子3
让我们看另一个简单的例子:
#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] = 7 ; Numbers[6] = 9 ; 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 //replacing any item that >= 10 with 30 last = replace_copy_if(start, end, resultIt, bind2nd(greater_equal<int>(), 10), 30) ; //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 ; }
输出:
Numbers { 10 20 10 15 12 7 9 10 }
Total number of elements copied to Result = 8
Result { 30 30 30 30 30 7 9 30 }
replace_copy_if - 例子4
让我们看另一个简单的例子:
#include <vector> #include <list> #include <algorithm> #include <iostream> bool greater6 ( int value ) { return value >6; } int main( ) { using namespace std; vector <int> v1; list <int> L1 (13); vector <int>::iterator Iter1; list <int>::iterator L_Iter1; int i; for ( i = 0 ; i <= 9 ; i++ ) v1.push_back( i ); int ii; for ( ii = 0 ; ii <= 3 ; ii++ ) v1.push_back( 7 ); random_shuffle ( v1.begin( ), v1.end( ) ); int iii; for ( iii = 0 ; iii <= 13 ; iii++ ) v1.push_back( 1 ); cout << "The original vector v1 is:\n ( " ; for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; Iter1++ ) cout << *Iter1 << " "; cout << ")." << endl; //Replace elements with a value of 7 in the 1st half of a vector //with a value of 70 and copy it into the 2nd half of the vector replace_copy_if ( v1.begin( ), v1.begin( ) + 14,v1.end( ) -14, greater6 , 70); cout << "The vector v1 with values of 70 replacing those greater" << "\n than 6 in the 1st half & copied into the 2nd half is:\n ( " ; for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; Iter1++ ) cout << *Iter1 << " "; cout << ")." << endl; //Replace elements in a vector with a value of 70 //with a value of 1 and copy into a list replace_copy_if ( v1.begin( ), v1.begin( ) + 13,L1.begin( ), greater6 , -1 ); cout << "A list copy of vector v1 with the value -1\n replacing " << "those greater than 6 is:\n ( " ; for ( L_Iter1 = L1.begin( ) ; L_Iter1 != L1.end( ) ; L_Iter1++ ) cout << *L_Iter1 << " "; cout << ")." << endl; }
输出:
The original vector v1 is: ( 4 7 7 7 0 5 7 1 6 9 3 7 8 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 ). The vector v1 with values of 70 replacing those greater than 6 in the 1st half & copied into the 2nd half is: ( 4 7 7 7 0 5 7 1 6 9 3 7 8 2 4 70 70 70 0 5 70 1 6 70 3 70 70 2 ). A list copy of vector v1 with the value -1 replacing those greater than 6 is: ( 4 -1 -1 -1 0 5 -1 1 6 -1 3 -1 -1 ).