C++算法remove()函數用於從給定範圍[first, last)中剔除所有等於val的元素,同時不打亂其餘元素的順序。
- 這個函數不能改變容器的大小。
- 它返回一個迭代器到範圍的新末端。
- remove 是穩定的,意味著不等於 val 的元素的相對順序保持不變。
- 此函數使用 operator== 將各個元素與 val 進行比較。
用法
template <class ForwardIterator, class T>
ForwardIterator remove (ForwardIterator first, ForwardIterator last, const T& val);
參數
first: 一個前向迭代器,指向元素被移除的範圍內的第一個元素的位置。
last:一個前向迭代器,指向從元素被移除的範圍中最後一個元素之後的位置。
val:要從範圍中刪除的值。
返回值
如果 first 和 last 相等,則指向修改範圍或第一個元素的新結束位置(last)的前向迭代器。
複雜度
複雜性在 [first, last) 範圍內是線性的,並且可能對其中的一些進行賦值。
數據競爭
範圍 [first, last) 中的對象被訪問並可能被修改。
異常安全
如果任何元素比較、元素分配或迭代器上的操作引發異常,則此函數將引發異常。
請注意,無效參數會導致未定義的行為。
例子1
讓我們看一個簡單的例子來演示 remove() 的使用:
#include <iostream> // std::cout
#include <algorithm> // std::remove
using namespace std;
int main () {
int myints[] = {10,20,30,50,20,40,100,20};
// bounds of range:
int* pbegin = myints;
int* pend = myints+sizeof(myints)/sizeof(int);
pend = remove (pbegin, pend, 20);
cout << "range contains:";
for (int* p=pbegin; p!=pend; ++p)
cout << ' ' << *p;
cout << '\n';
return 0;
}
輸出:
range contains:10 30 50 40 100
例子2
我們再看一個簡單的例子來說明 erase() 和 remove() 的區別:
#include <iostream>
#include <vector>
#include <algorithm>
int main()
{
using namespace std;
//Populate myvec with the data set 10, 5, -8, 5, 1, 4
vector<int> myvec;
myvec.push_back(10);
myvec.push_back(5);
myvec.push_back(-8);
myvec.push_back(5);
myvec.push_back(1);
myvec.push_back(4);
cout << "\n Initial data set: ";
for(size_t i(0); i!=myvec.size(); ++i)
cout << myvec.at(i) << ' ';
//Remove the data elements matching '5'
vector<int>::iterator invalid;
invalid = remove( myvec.begin(), myvec.end(), 5 );
cout << "\n\n Data set after remove:";
for(size_t i(0); i!=myvec.size(); ++i)
cout << myvec.at(i) << ' ';
//Destroy the remaining invalid elements
myvec.erase( invalid, myvec.end() );
cout << "\n\n Data set after erase: ";
for(size_t i(0); i!=myvec.size(); ++i)
cout << myvec.at(i) << ' ';
return 0;
}
輸出:
Initial data set: 10 5 -8 5 1 4 Data set after remove:10 -8 1 4 1 4 Data set after erase: 10 -8 1 4
例子3
讓我們看另一個簡單的例子:
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
bool IsOdd(int i)
{
return ((i % 2) == 1);
}
// Driver code
int main ()
{
vector <int> vec1 { 10, 20, 30, 30, 20, 10, 10, 20};
// Print original vector
cout << "Original vector:";
for(int i=0; i < vec1.size(); i++)
cout << " " << vec1[i];
cout << "\n";
// Iterator that store the position of last element
vector <int>::iterator pend;
// std::remove function call
pend = remove (vec1.begin(), vec1.end() , 20);
// Print the vector
cout << "After remove:";
for ( vector<int>::iterator p=vec1.begin(); p != pend; ++p)
cout << ' ' << *p;
cout << '\n';
return 0;
}
輸出:
Original vector: 10 20 30 30 20 10 10 20 After remove: 10 30 30 10 10
示例 4
讓我們看另一個簡單的例子:
#include <vector>
#include <algorithm>
#include <iostream>
int main( ) {
using namespace std;
vector <int> v1;
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 with a value of 7
new_end = remove ( v1.begin( ), v1.end( ), 7 );
cout << "Vector v1 with value 7 removed is ( " ;
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 with value 7 removed is ( " ;
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 value 7 removed is ( 4 0 5 1 6 9 3 8 2 9 3 7 8 2 ). Vector v1 resized with value 7 removed is ( 4 0 5 1 6 9 3 8 2 ).
相關用法
- C++ Algorithm remove_if()用法及代碼示例
- C++ Algorithm remove_copy_if()用法及代碼示例
- C++ Algorithm remove_copy()用法及代碼示例
- 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()。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。