C++ 算法 remove_copy_if() 函數用於將[first, last) 範圍內的所有元素複製到從result 開始的範圍內,除了那些pred 返回true 的元素,不影響其餘元素的順序。
這個函數不能改變容器的大小。
- 它返回一個迭代器到範圍的新末端。
- 移除是穩定的,意味著未被移除的元素的相對順序保持不變。
用法
template <class InputIterator, class OutputIterator, class UnaryPredicate>
OutputIterator remove_copy_if (InputIterator first, InputIterator last,
OutputIterator result, UnaryPredicate pred);
參數
first: 一個前向迭代器,指向元素被移除的範圍內的第一個元素的位置。
last:一個前向迭代器,指向從元素被移除的範圍中最後一個元素之後的位置。
result:一個輸出迭代器,指向元素被移除的範圍的初始位置。
pred: 必須滿足的是要替換元素的值。
返回值
指向複製範圍的新結束位置 (last) 的前向迭代器,其中包括 [first, last) 中的所有元素,除了那些 pred 將返回 true 的元素。
複雜度
複雜度在[first, last)範圍內是線性的:對每個元素應用pred,對沒有去除的元素進行賦值操作。
數據競爭
訪問範圍 [first, last) 中的對象。
結果和返回值之間範圍內的對象發生了變化。
異常
如果 pred、元素賦值或迭代器上的操作中的任何一個拋出異常,則此函數將拋出異常。
請注意,無效參數會導致未定義的行為。
例子1
讓我們看一個簡單的例子來演示 remove_copy_if() 的使用:
#include <algorithm>
#include <iostream>
#include <vector>
#include <iterator>
using namespace std;
int main() {
vector<int> v = { 2,1,3,4,5,7,6,9,8};
remove_copy_if(v.begin(), v.end(),
ostream_iterator<int>(cout, ","),
[](int x) { return x%2 != 0; });
return 0;
}
輸出:
2,4,6,8,
例子2
讓我們看另一個簡單的例子:
#include <vector>
#include <algorithm>
#include <iostream>
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 <int> &v1, vector<int> &v2)
{
remove_copy_if(v1.begin(), v1.end(), v2.begin(), IsOdd);
}
// 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;
}
int main()
{
// declare vector v1, v2
vector <int> 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" <<endl;
print(v2);
return 0;
}
輸出:
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
例子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] = 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<int>(), 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 }
示例 4
讓我們看另一個簡單的例子:
#include <vector>
#include <algorithm>
#include <iostream>
using namespace std;
bool greathan(int value)
{ return value >7;}
int main(void)
{
// vector container
vector <int> vec1, vec2(14);
// vector iterator
vector <int>::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<<endl;
// randomly shuffle the data
random_shuffle(vec1.begin(), vec1.end());
cout<<"\nThe original vec1 vector data randomly shuffled:";
for(Iter1 = vec1.begin(); Iter1 != vec1.end(); Iter1++)
cout<<*Iter1<<" ";
cout<<endl;
// remove elements with a value greater than 7
new_end = remove_copy_if(vec1.begin(), vec1.end(), vec2.begin(), greathan);
cout<<"\nAfter the remove_copy_if() operation, the vec1 vector is left unchanged as:";
for(Iter1 = vec1.begin(); Iter1 != vec1.end(); Iter1++)
cout<<*Iter1<<" ";
cout<<endl;
cout<<"\nvec2 vector is a copy of vec1 vector with values greater than 7 removed:";
for(Iter2 = vec2.begin(); Iter2 != new_end; Iter2++)
cout<<*Iter2<<" ";
cout<<endl;
return 0;
}
輸出:
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
相關用法
- C++ Algorithm remove_copy()用法及代碼示例
- C++ Algorithm remove_if()用法及代碼示例
- C++ Algorithm remove()用法及代碼示例
- C++ Algorithm replace()用法及代碼示例
- C++ Algorithm reverse_copy()用法及代碼示例
- C++ Algorithm replace_copy()用法及代碼示例
- C++ Algorithm replace_copy_if()用法及代碼示例
- C++ Algorithm reverse()用法及代碼示例
- C++ Algorithm replace_if()用法及代碼示例
- C++ Algorithm random_shuffle()用法及代碼示例
- C++ Algorithm rotate()用法及代碼示例
- C++ Algorithm rotate_copy()用法及代碼示例
- C++ Algorithm max_element()用法及代碼示例
- C++ Algorithm set_union()用法及代碼示例
- C++ Algorithm next_permutation()用法及代碼示例
- C++ Algorithm upper_bound()用法及代碼示例
- C++ Algorithm minmax()用法及代碼示例
- C++ Algorithm pop_heap()用法及代碼示例
- C++ Algorithm set_intersection()用法及代碼示例
- C++ Algorithm lower_bound()用法及代碼示例
注:本文由純淨天空篩選整理自 C++ Algorithm remove_copy_if()。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。