C++算法remove_if()函數用於從給定範圍[first, last)中剔除所有滿足謂詞的元素,同時不打亂其餘元素的順序。
- 這個函數不能改變容器的大小。
- 它返回一個迭代器到範圍的新末端。
- 移除是穩定的,意味著未被移除的元素的相對順序保持不變。
用法
template <class ForwardIterator, class UnaryPredicate>
ForwardIterator remove_if (ForwardIterator first, ForwardIterator last,
UnaryPredicate pred);
參數
first: 一個前向迭代器,指向元素被移除的範圍內的第一個元素的位置。
last:一個前向迭代器,指向從元素被移除的範圍中最後一個元素之後的位置。
pred:接受元素作為參數的一元謂詞函數必須滿足是要替換元素的值。
返回值
如果 first 和 last 相等,則指向修改範圍或第一個元素的新結束位置(last)的前向迭代器。
複雜度
複雜度在 [first, last) 範圍內是線性的:將 pred 應用於每個元素,並可能對其中的一些元素執行賦值。
數據競爭
範圍 [first, last) 中的對象被訪問並可能被修改。
異常安全
如果 pred、元素賦值或迭代器上的操作中的任何一個拋出異常,則此函數將拋出異常。
注意:無效的參數會導致未定義的行為。
例子1
讓我們看一個簡單的例子來演示 remove_if() 的使用:
#include <algorithm>
#include <iostream>
#include <vector>
using namespace std;
bool IsOdd(int i)
{
return ((i % 2) == 1);
}
int main ()
{
vector <int> vec2 { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
//store the position of last element
vector <int>::iterator pend;
// Print original vector
cout << "\nOriginal vector:";
for(int i=0; i < vec2.size(); i++)
cout << " " << vec2[i];
cout << "\n";
// remove_if function call
pend = remove_if (vec2.begin(), vec2.end() , IsOdd);
// Print the vector
cout << "After remove_if:";
for ( vector<int>::iterator q=vec2.begin(); q != pend; ++q)
cout << ' ' << *q;
cout << '\n';
return 0;
}
輸出:
Original vector: 1 2 3 4 5 6 7 8 9 10 After remove_if:2 4 6 8 10
例子2
讓我們看另一個簡單的例子:
#include <vector>
#include <algorithm>
#include <iostream>
using namespace std;
bool greater6 ( int value ) {
return value >6;
}
int main( ) {
vector <int> v1, v2;
vector <int>::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 << "Vector v1 is ( " ;
for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; Iter1++ )
cout << *Iter1 << " ";
cout << ")." << endl;
// Remove elements satisfying predicate greater6
new_end = remove_if (v1.begin( ), v1.end( ), greater6 );
cout << "Vector v1 with elements satisfying greater6 removed is\n ( " ;
for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; Iter1++ )
cout << *Iter1 << " ";
cout << ")." << endl;
// To change the sequence size, use erase
v1.erase (new_end, v1.end( ) );
cout << "Vector v1 resized elements satisfying greater6 removed is\n ( " ;
for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; Iter1++ )
cout << *Iter1 << " ";
cout << ")." << endl;
return 0;
}
輸出:
Vector v1 is ( 4 7 7 7 0 5 7 1 6 9 3 7 8 2 ). Vector v1 with elements satisfying greater6 removed is ( 4 0 5 1 6 3 2 1 6 9 3 7 8 2 ). Vector v1 resized elements satisfying greater6 removed is ( 4 0 5 1 6 3 2 ).
例子3
讓我們看另一個簡單的例子:
#include <iostream>
#include <functional>
#include <vector>
#include <algorithm>
typedef std::vector<std::string>::iterator iterator;
struct startsWithA:public std::unary_function<std::string, bool> {
bool operator() (std::string s)
{
if(s[0] == 'A')
{
return true;
}
else
return false;
}
};
void print(iterator b, iterator e)
{
iterator i;
for(i = b; i != e; i++)
{
std::cout << *i << " ";
}
std::cout << std::endl;
}
int main()
{
startsWithA s;
std::vector<std::string> v;
v.push_back("China");
v.push_back("India");
v.push_back("Korea");
v.push_back("America");
v.push_back("Australia");
v.push_back("Pakistan");
std::cout << "Vector:";
print(v.begin(), v.end());
iterator i = remove_if(v.begin(), v.end(), s);
std::cout << "Vector:";
print(v.begin(), i);
return 0;
}
輸出:
Vector:China India Korea America Australia Pakistan Vector:China India Korea Pakistan
示例 4
讓我們看另一個簡單的例子,它通過將所有非空格字符向左移動然後擦除多餘的空格來刪除字符串中的所有空格。
#include <algorithm>
#include <string>
#include <iostream>
#include <cctype>
using namespace std;
int main()
{
string str1 = "Text with some spaces";
str1.erase(remove(str1.begin(), str1.end(), ' '),
str1.end());
cout << str1 << '\n';
string str2 = "Text\n with\tsome \t whitespaces\n\n";
str2.erase(remove_if(str2.begin(),
str2.end(),
[](unsigned char x){return std::isspace(x);}),
str2.end());
cout << str2 << '\n';
return 0;
}
輸出:
Textwithsomespaces Textwithsomewhitespaces
相關用法
- C++ Algorithm remove_copy_if()用法及代碼示例
- C++ Algorithm remove_copy()用法及代碼示例
- 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_if()。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。