当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


C++ Algorithm replace_copy_if()用法及代码示例


C++ 算法 replace_copy_if() 函数用于将范围 [first, last) 复制到从结果开始的范围,将 pred 返回 true 的那些放置在 new_value 处。它使用谓词 pred 而不是 operator== 来比较元素。

此函数检查源范围中的每个元素,并在将结果复制到新的目标范围时如果满足指定的谓词,则替换它。

用法

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);

参数

first:一个输入迭代器,指向元素被替换的范围内的初始位置。

last:一个输入迭代器,指向元素被替换的范围内的最终位置。

result:一个输出迭代器,指向存储结果序列的范围的第一个元素。

pred:如果要替换元素的值,则必须满足的一元谓词。

old_value:被替换元素的旧值。

new_value:分配给具有旧值的元素的新值。

返回值

replace_copy_if() 函数返回一个输出迭代器,该迭代器指向指向结果序列中写入的最后一个元素的位置。

复杂度

复杂度与 first 和 last 之间的距离呈线性:应用 pred 并为每个元素执行赋值。

数据竞争

访问范围 [first1, last1) 中的对象。

结果和返回值范围内的对象被修改。

异常安全

如果 pred、元素赋值或迭代器上的操作中的任何一个抛出异常,则此函数将抛出异常。

请注意,无效参数会导致未定义的行为。

例子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,

例子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

例子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  }

示例 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 ).





相关用法


注:本文由纯净天空筛选整理自 C++ Algorithm replace_copy_if()。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。