C++ remove erase 用法淺析

C++ remove erase 用法淺析

remove 用法淺析

寫這篇淺析徹底是意料以外的,只怪才疏學淺。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 實現

其實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上面的一些帖子,看了好多篇,也沒有說到點子上,還有解釋錯的,更是有抄錯的。。

原文地址:C++ remove erase 用法淺析

相關文章
相關標籤/搜索