簡體   English   中英

從字符串中刪除字符,直到它變空

[英]Removing Characters from String until it becomes empty

我無法解決這個問題。 我正在嘗試刪除字符串中某個字符的所有出現,直到字符串變空。 我知道我們可以通過使用string :: erase和std :: remove的組合來刪除std :: string中所有出現的字符,如下所示:

s.erase(remove(s.begin(), s.end(), '.'), s.end());

其中的“。” 是要刪除的實際字符。 如果我嘗試刪除某些字符,它甚至可以工作。 現在,讓我們考慮以下字符串:'abababababababa'。 我要實現的目標是減少字符串,以消除所有開頭的“ a”為灰燼,這將使我留下幾個“ b”。 然后刪除所有將留下空字符串的“ b”。 當然,這只是我任務的一部分,但我可以縮小此問題的范圍。 這是我基於功能上層組合的幼稚方法:

string s = "abababababababa";
while (!s.empty()) {
    ...
    s.erase(remove(s.begin(), s.end(), s[0]), s.end());
    ...
}

當然,它不起作用,我似乎無法找出原因。 通過調試應用程序,我可以看到如何修改“ s”字符串。 雖然s.erase ...可以完美地工作,但如果我為remove的第三個參數設置了字符常量,則在嘗試使用char變量時會失敗。 每次迭代后,s字符串如下所示:

Removing[a] from [abababababababa] Result: baaaaaaa
Removing[b] from [baaaaaaa] Result: a
Removing[a] from [a] Result: -

雖然我希望進行2次操作,直到字符串變為空為止-這是可行的,但如果我手工對字母進行硬編碼並使用s.erase兩次,則實際上需要3次迭代。 但是,最令人沮喪的部分是,當我在第一次迭代中刪除“ a”時,只有第一個“ a”被刪除,而所有其他“ b”被刪除。 為什么會這樣呢? 這是內部擦除/刪除工作原理的原因嗎?

您有未定義的行為

您得到的結果是因為std::remove接受了按引用 std::remove的值,一旦s[0]被刪除,對該引用的引用會發生什么?

簡單的解決方案是創建一個臨時變量,為其分配例如s[0] ,然后傳遞該變量。

函數remove()模板的行為等效於:

template <class ForwardIterator, class T>
  ForwardIterator remove (ForwardIterator first, ForwardIterator last, const T& val)
{
  ForwardIterator result = first;
  while (first!=last) {
    if (!(*first == val)) {
      *result = move(*first);
      ++result;
    }
    ++first;
  }
  return result;
}

如您所見,該函數會將與val不同的元素移到范圍的前面。 因此,在您的情況“ ababababab”中,如果像您一樣調用remove() ,則原始s [0]為'a',但是在remove()期間它將由'b'代替,其余代碼將刪除'b',因此結果不正確。 就像Joachim所說的那樣,將s [0]分配給一個臨時變量。

該代碼來自http://www.cplusplus.com/reference/algorithm/remove/?kw=remove

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM