📅  最后修改于: 2020-10-17 04:50:19             🧑  作者: Mango
C++ STL algorithm.remove_copy()函数用于从范围[first,last)中复制不等于val的所有元素,以提供结果而不会干扰其余元素的顺序。
此函数无法更改容器的大小。
template
OutputIterator remove_copy (InputIterator first, InputIterator last, OutputIterator result, const T& val);
first:前向迭代器,指向要从中删除元素的范围内的第一个元素的位置。
last:一个正向迭代器,它在要删除元素的范围内将位置指向最后一个元素之后的位置。
结果:一个输出迭代器,该迭代器指向要删除元素的范围的初始位置。
val:将从[first,last)范围中删除的值。
指向复制范围的新结束位置(最后)的前向迭代器,其中包括[first,last)中的所有元素,但比较等于val的元素除外。
复杂度在[first,last)范围内呈线性:比较每个元素,并对未删除的元素执行分配操作。
访问范围为[first,last)的对象。
结果和返回值之间的范围内的对象将更改。
如果元素比较,元素分配或迭代器上的任何操作抛出异常,则此函数将引发异常。
注意:无效的参数可能会导致未定义的行为。
让我们看一个简单的示例来演示remove_copy()的用法:
#include
#include
#include
#include
using namespace std;
int main() {
vector v = { 2,3,1,2,1 };
remove_copy(v.begin(), v.end(),
ostream_iterator(cout, ","), 1);
return 0;
}
输出:
2,3,2,
让我们看另一个简单的例子:
#include // std::cout
#include // std::remove_copy
#include // std::vector
using namespace std;
int main () {
int myints[] = {10,20,50,30,20,10,40,20};
vector myvector (8);
remove_copy (myints,myints+8,myvector.begin(),20);
cout << "myvector contains:";
for (vector::iterator it=myvector.begin(); it!=myvector.end(); ++it)
cout << ' ' << *it;
cout << '\n';
return 0;
}
输出:
myvector contains: 10 50 30 10 40 0 0 0
让我们看另一个简单的示例,以删除给定文本中的所有空格:
#include
#include
#include
#include
using namespace std;
int main()
{
string str = "Text with some spaces";
cout << "before: " << str << "\n";
cout << "after: ";
remove_copy(str.begin(), str.end(),
ostream_iterator(cout), ' ');
cout << '\n';
return 0;
}
输出:
before: Text with some spaces
after: Textwithsomespaces
让我们看另一个简单的例子:
#include
#include
#include
int main() {
using namespace std;
vector v1, v2(10);
vector ::iterator Iter1, Iter2, new_end;
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( ) );
cout << "The original vector v1 is: ( " ;
for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; Iter1++ )
cout << *Iter1 << " ";
cout << ")." << endl;
// Remove elements with a value of 7
new_end = remove_copy ( v1.begin( ), v1.end( ), v2.begin( ), 7 );
cout << "Vector v1 is left unchanged as ( " ;
for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; Iter1++ )
cout << *Iter1 << " ";
cout << ")." << endl;
cout << "Vector v2 is a copy of v1 with the value 7 removed:\n ( " ;
for ( Iter2 = v2.begin( ) ; Iter2 != v2.end( ) ; Iter2++ )
cout << *Iter2 << " ";
cout << ")." << endl;
}
输出:
The original vector v1 is: ( 4 7 7 7 0 5 7 1 6 9 3 7 8 2 ).
Vector v1 is left unchanged as ( 4 7 7 7 0 5 7 1 6 9 3 7 8 2 ).
Vector v2 is a copy of v1 with the value 7 removed:
( 4 0 5 1 6 9 3 8 2 0 ).