C++ remove erase 用法淺析
remove 用法淺析
寫這篇淺析完全是意料之外的,只怪才疏學淺。
刷[Leetcode]929. Unique Email Addresses的時候不能用boost庫,一臉懵逼,為了去除整個字串中的“.”,boost庫中就是一句話boost::erase_all(str, ‘.’),但是stl庫中沒有現成的介面可以使用,求助Google,發現了erase和remove結合使用可以達到目的;
local.erase(remove(local.begin(), local.end(), '.'), local.end()); // 刪除local字串中所有的'.'
複製程式碼
但是這樣的用法沒玩過,不是特別好理解,寫個demo驗證下,先看程式碼:
#include <algorithm>
#include <iostream>
#include <iterator>
#include <string>
using namespace std;
int main(int argc, char *argv[])
{
string str = "helloworld";
cout << "before remove: " << str << endl;
string::iterator ret_end = remove(str.begin(), str.end(), 'o'); // remove字串中所有的‘o’,此時並沒有真正刪除
cout << "after remove: " << str << endl;
cout << "ret_end: ";
for (string::iterator i = str.begin(); i < ret_end; i++) {
cout << *i; // 這裡列印的結果是從str的開頭,到截止remove返回的應該結束的位置;
}
cout << endl;
str = "helloworld";
cout << "before erase: " << str << endl;
str.erase(remove(str.begin(), str.end(), 'o'), str.end());
cout << "after erase: " << str << endl;
return 0;
}
複製程式碼
先看下輸出結果:
before remove: helloworld
after remove: hellwrldld
ret_end: hellwrld
before erase: helloworld
after erase: hellwrld
複製程式碼
具體看下remove的介面,cpluscplus手冊上的連結std::remove
template <class ForwardIterator, class T>
ForwardIterator remove (ForwardIterator first, ForwardIterator last, const T& val);
複製程式碼
輸入三個引數:迭代器起始,迭代器結束,要移除的值;
返回:迭代器,指向未移去的最後一個元素的下一個位置;
手冊裡面有一句解釋:
The range between first and this iterator includes all the elements in the sequence that do not compare equal to val.
[first return)之間(不包含return指定的元素,到前一個截止),包含的是所有和val不等的元素,如上面demo中ret_end所示:
ret_end: hellwrld // first到ret_end包含所有不等於 ‘o’ 的序列, ret_end則指向的是‘ld’之後的那個‘l’
remove 實現
其實remove的實現,手冊裡面也有描述,就是需要理解一下
template <class ForwardIterator, class T>
ForwardIterator remove (ForwardIterator first, ForwardIterator last, const T& val)
{
ForwardIterator result = first;
while (first!=last) {
if (!(*first == val)) { // first不等於val時,result對應的值才會更新,並指向下一個元素
*result = move(*first);
++result;
}
++first;
}
return result;
}
複製程式碼
就到這。。順便吐槽 一下csdn上面的一些帖子,看了好多篇,也沒有說到點子上,還有解釋錯的,更是有抄錯的。。