📅  最后修改于: 2020-10-17 04:25:25             🧑  作者: Mango
C++ STL algorithm.remove_copy_if()函数用于将范围[first,last)内的所有元素复制到以结果开头的范围内,除了pred返回true的那些元素,而不会干扰其余元素的顺序。
此函数无法更改容器的大小。
template
OutputIterator remove_copy_if (InputIterator first, InputIterator last,
OutputIterator result, UnaryPredicate pred);
first:前向迭代器,指向要从中删除元素的范围内的第一个元素的位置。
last:一个正向迭代器,它在要删除元素的范围内将位置指向最后一个元素之后的位置。
结果:一个输出迭代器,该迭代器指向要删除元素的范围的初始位置。
前提:必须替换一个元素的值。
指向复制范围的新结束位置(最后一个)的前向迭代器,其中包括[first,last)中的所有元素,但pred将返回true的元素除外。
复杂度在[first,last)范围内是线性的:将pred应用于每个元素,并对未删除的元素执行分配操作。
访问范围为[first,last)的对象。
结果和返回值之间的范围内的对象将更改。
如果pred,元素分配或迭代器上的任何操作引发异常,则此函数引发异常。
请注意,无效的参数会导致未定义的行为。
让我们看一个简单的示例,以演示remove_copy_if()的用法:
#include
#include
#include
#include
using namespace std;
int main() {
vector v = { 2,1,3,4,5,7,6,9,8};
remove_copy_if(v.begin(), v.end(),
ostream_iterator(cout, ","),
[](int x) { return x%2 != 0; });
return 0;
}
输出:
2,4,6,8,
让我们看另一个简单的例子:
#include
#include
#include
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 &v1, vector &v2)
{
remove_copy_if(v1.begin(), v1.end(), v2.begin(), IsOdd);
}
// Function to print content of vector
void print(vector&v)
{
int len = v.size();
for (int i = 0; i < len; i++)
cout << v[i] << " ";
cout << endl;
}
int main()
{
// declare vector v1, v2
vector 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" <
输出:
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
#include
#include
#include
using namespace std;
int main()
{
const int MAX_ELEMENTS = 8 ;
// Define a template class vector of integers
typedef vector 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(), 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
#include
#include
using namespace std;
bool greathan(int value)
{ return value >7;}
int main(void)
{
// vector container
vector vec1, vec2(14);
// vector iterator
vector ::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<
输出:
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