C++中要從string
中刪除全部某個特定字符, 可用以下代碼ios
str.erase(std::remove(str.begin(), str.end(), 'a'), str.end());
其中, remove
來自<algorithm>
, 它的簽名是函數
template <class ForwardIterator, class T> ForwardIterator remove (ForwardIterator first, ForwardIterator last, const T& val);
做用: 在容器中, 刪除[first, last)
之間的全部值等於val
的值.code
刪除方法: 將某個等於val
的值用下一個不等於val
的值覆蓋.rem
返回值: 一個迭代器 (記做newEnd
), 該迭代器指向最後一個未被刪除元素的下一個元素, 即至關於容器新的end
.get
因此, 運行完remove
後, 容器的[first, newEnd)
內的元素即爲全部未被刪除的元素, [newEnd, end)
之間的元素已經沒用了.string
這樣, 再運行str.erase(newEnd, str.end())
便可清空[newEnd, end)
之間的元素.it
std::remove_if
與remove
相似, 只是它接受的第三個參數是個函數.io
// remove_if example #include <iostream> // std::cout #include <algorithm> // std::remove_if bool IsOdd (int i) { return ((i%2)==1); } int main () { int myints[] = {1,2,3,4,5,6,7,8,9}; // 1 2 3 4 5 6 7 8 9 // bounds of range: int* pbegin = myints; // ^ int* pend = myints+sizeof(myints)/sizeof(int); // ^ ^ pend = std::remove_if (pbegin, pend, IsOdd); // 2 4 6 8 ? ? ? ? ? // ^ ^ std::cout << "the range contains:"; for (int* p=pbegin; p!=pend; ++p) std::cout << ' ' << *p; std::cout << '\n'; return 0; }
Output:ast
myvector contains: 10 30 30 10 10 0 0 0
還有個std::remove_copy
, 簽名:class
template <class InputIterator, class OutputIterator, class T> OutputIterator remove_copy (InputIterator first, InputIterator last, OutputIterator result, const T& val);
它會把[first, last)
之間不等於val
的元素都向從result
開始的容器拷貝.
// remove_copy example #include <iostream> // std::cout #include <algorithm> // std::remove_copy #include <vector> // std::vector int main () { int myints[] = {10,20,30,30,20,10,10,20}; // 10 20 30 30 20 10 10 20 std::vector<int> myvector (8); std::remove_copy (myints,myints+8,myvector.begin(),20); // 10 30 30 10 10 0 0 0 std::cout << "myvector contains:"; for (std::vector<int>::iterator it=myvector.begin(); it!=myvector.end(); ++it) std::cout << ' ' << *it; std::cout << '\n'; return 0; }
Output:
myvector contains: 10 30 30 10 10 0 0 0