C++ remove erase 用法淺析

c1rew發表於2019-04-12

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

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