2017-06-15 70 views
0

我試圖從字符串中刪除連續的重複字符,如"helloworld",並刪除所有出現的重複字符。在這種情況下,它是'l',所以新字符串應該是"heoword"。我已經寫了這樣的代碼:爲什麼我需要拋出算法remove()的參數?

#include <algorithm> 
#include <string> 
#include <iostream> 

using namespace std; 

int main() { 
    string s = "helloworld"; 
    for (int i = 0; i < s.length() - 1; i++) { 
    if (s[i] == s[i+1]) { 
     s.erase(remove(s.begin(), s.end(), s[i]), s.end()); // PROBLEM 
     cout << s << endl; // printing `heowrld`, instead of `heoword` 
    } 
    } 
    return 0; 
} 

上面的代碼不工作,除非我投s[i]喜歡(char)s[i]。我查找了運算符[]作爲字符串,它將位置處的字符返回給引用。 remove方法也接受const T& val作爲要替換字符的參數。由於它們都屬於同一類型,爲什麼我不能將s[i]作爲remove方法的參數?

p.s.這不是家庭作業問題。通過在remove中投下s[i],我可以得到正確的輸出,但我想知道爲什麼我需要投出s[i]

+7

什麼是確切的編譯器錯誤? – NathanOliver

+0

這可能是家庭作業,因此教官fiat禁止,但[看看'std :: unique'](http://en.cppreference.com/w/cpp/algorithm/unique) – user4581301

+0

@NathanOliver我是沒有得到任何錯誤,但輸出是'heowrld'而不是'heoword'。 – pseudo

回答

2

這裏的問題是你的價值從你自己身上移除。讓我們看一下

#include <iostream> 

int main() 
{ 
    int a = 5, b = 10; 
    int & ref = a; 
    std::cout << "a: " << a << " b: " << b << " ref: " << ref << "\n"; 
    std::swap(a, b); 
    std::cout << "a: " << a << " b: " << b << " ref: " << ref << "\n"; 
} 

如果你運行它,你會得到

a: 5 b: 10 ref: 5 
a: 10 b: 5 ref: 10 

,正如你可以看到ref不會移動到現在跟隨ba停留(因爲它應該),並打印a新的價值。

我們正在與

s.erase(remove(s.begin(), s.end(), s[i]), s.end()); 

看到了同樣的事情,因爲s[i]是字符串中的元素的引用它的值被改變刪除交換周圍的元素。因此,它刪除了兩個l,然後它也刪除了最後一個o,因爲o移動到l用於佔用的相同位置,但它僅在字符串中傳遞第一個o後才移除。

鑄造「修復」這個原因是因爲現在你不再引用字符串的一個元素。您創建一個臨時變量,並使用該變量值來刪除l的。

+0

謝謝!這是一個明確的答案。 – pseudo

+0

@pseudo歡迎您。樂意效勞。 – NathanOliver

相關問題