function template
<algorithm>
std::remove_copy_if
template <class InputIterator, class OutputIterator, class UnaryPredicate> OutputIterator remove_copy_if (InputIterator first, InputIterator last, OutputIterator result, UnaryPredicate pred);
Copy range removing values
将范围 [first,last)
中的元素复制到以 result 开头的范围中,除非 pred 返回 true
。
结果范围的长度比 [first,last)
短,减少的数量等于匹配(即“移除”)的元素数量。
此函数模板的行为等同于
1 2 3 4 5 6 7 8 9 10 11 12 13
|
template <class InputIterator, class OutputIterator, class UnaryPredicate>
OutputIterator remove_copy_if (InputIterator first, InputIterator last,
OutputIterator result, UnaryPredicate pred)
{
while (first!=last) {
if (!pred(*first)) {
*result = *first;
++result;
}
++first;
}
return result;
}
|
参数
- first, last
- Forward iterators 指向序列的初始和最终位置。使用的范围是
[first,last)
,它包含 first 和 last 之间的所有元素,包括 first 指向的元素,但不包括 last 指向的元素。
- result
- 输出迭代器,指向存储结果序列的范围的起始位置。
指向的类型应支持被赋值为范围 [first,last)
中某个元素的值。
- pred
- 一元函数,接受范围中的元素作为参数,并返回一个可转换为
bool
的值。返回的值指示该元素是否应从副本中移除(如果为 true
,则不复制)。
该函数不得修改其参数。
这可以是函数指针,也可以是函数对象。
这些范围不应重叠。
返回值
指向已复制范围末尾的迭代器,该范围包括 [first,last)
中的所有元素,但不包括 pred 返回 true
的那些元素。
示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
|
// remove_copy_if example
#include <iostream> // std::cout
#include <algorithm> // std::remove_copy_if
#include <vector> // std::vector
bool IsOdd (int i) { return ((i%2)==1); }
int main () {
int myints[] = {1,2,3,4,5,6,7,8,9};
std::vector<int> myvector (9);
std::remove_copy_if (myints,myints+9,myvector.begin(),IsOdd);
std::cout << "myvector contains:";
for (std::vector<int>::iterator it=myvector.begin(); it!=myvector.end(); ++it)
std::cout << ' ' << *it;
std::cout << '\n';
return 0;
}
|
输出
myvector contains: 2 4 6 8 0 0 0 0 0
|
复杂度
线性复杂度,与 first 和 last 之间的 距离 成正比:将 pred 应用于每个元素,并对未移除的元素执行赋值操作。
数据竞争
访问范围 [first,last)
中的对象。
修改 result 和返回的迭代器之间的范围内的对象。
异常
如果 pred、元素赋值或迭代器操作抛出异常,则此函数也抛出异常。
请注意,无效参数会导致未定义行为。