寫這篇淺析徹底是意料以外的,只怪才疏學淺。ios
刷[Leetcode]929. Unique Email Addresses的時候不能用boost庫,一臉懵逼,爲了去除整個字符串中的「.」,boost庫中就是一句話boost::erase_all(str, ‘.’),可是stl庫中沒有現成的接口能夠使用,求助Google,發現了erase和remove結合使用能夠達到目的;c++
local.erase(remove(local.begin(), local.end(), '.'), local.end()); // 刪除local字符串中全部的'.'
複製代碼
可是這樣的用法沒玩過,不是特別好理解,寫個demo驗證下,先看代碼:git
#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;
}
複製代碼
先看下輸出結果:github
before remove: helloworld
after remove: hellwrldld
ret_end: hellwrld
before erase: helloworld
after erase: hellwrld
複製代碼
具體看下remove的接口,cpluscplus手冊上的連接std::removebash
template <class ForwardIterator, class T> ForwardIterator remove (ForwardIterator first, ForwardIterator last, const T& val);
複製代碼
輸入三個參數:迭代器起始,迭代器結束,要移除的值;ui
返回:迭代器,指向未移去的最後一個元素的下一個位置;this
手冊裏面有一句解釋:spa
The range between first and this iterator includes all the elements in the sequence that do not compare equal to val.code
[first return)之間(不包含return指定的元素,到前一個截止),包含的是全部和val不等的元素,如上面demo中ret_end所示:接口
ret_end: hellwrld // first到ret_end包含全部不等於 ‘o’ 的序列, ret_end則指向的是‘ld’以後的那個‘l’
其實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上面的一些帖子,看了好多篇,也沒有說到點子上,還有解釋錯的,更是有抄錯的。。