2015-11-08 302 views
0

我試圖使用isWordChar()方法從字符串中刪除特殊字符。但是,我需要保留兩個特殊字符,「'」和「 - 」,如「不是」的撇號和婆婆的連字符。這是我想要實現的:從C++字符串中刪除特殊字符(除'和 - )

std::string WordCount::stripWord(std::string word) { 

    for(unsigned int i = 0; i < wrd.size(); ++i) 
    { 
     if(!isWordChar(wrd[i]) && (wrd[i]!=39 && wrd[i]!=45)) 
     { 
     wrd.erase(wrd.begin()+i); 
     --i; 
     } 
    } 

    return wrd; 
} 

在我的布爾中添加特殊情況後,我似乎無法正確添加異常。任何提示或建議?謝謝!

+0

問題不明確。請解釋你的意思,「我似乎無法正確添加例外。」呈現的代碼看起來就像你描述的那樣,所以它是什麼錯誤? – bames53

+0

另外,不要使用數字代替字符文字,並且''的標準算法應該優於手動循環。 – bames53

回答

1

您的邏輯錯誤。它應該是:!isWordChar(wrd[i]) && wrd[i] != 39 && wrd[i] != 45。閱讀爲:如果角色不是單詞字符,也不是撇號,並且不是連字符,請執行if語句中的任何操作。

+0

我試着用&&和||布爾的後半部分的運算符如下所示: if(! @ AnthonyCalandra – ewok896

+0

@ ewok896我不明白。你試過我給的以上嗎? –

+0

對不起,反應不佳。是的,我用&&操作符試過了,它沒有成功 – ewok896

3

我會使用remove /擦除成語:

word.erase(std::remove_if(word.begin(), 
    word.end(), 
    [](char c) { 
     return !(isWordChar(c) || '-' == c || '\'' == c); 
    }), word.end()); 

你刪除字符的方式有大約O(N * M)(其中N是字符串的原始長度,M是複雜你刪除的字符數)。這具有大約O(N)的複雜度,所以如果你刪除很多字符(或字符串很長),它可能會大大提高速度。

如果你在乎它爲什麼速度如此之快,那是因爲它的工作原理有所不同。具體而言,當您從字符串中間擦除元素時,擦除功能會立即複製之後的所有字母以填充刪除角色的孔。如果你這樣做了M次,那麼對於你刪除的每個字符,所有這些字符都會被複制一次。

當您使用remove_if,它更多的東西是這樣的:

template <class Iter, class F> 
Iter remove_if(Iter b, iter e, F f) 
    auto dest = word.begin(); 

    for (auto src=word.begin(); src != word.end(); ++src) 
     if (!f(*src)) 
      *dst++ = *src; 
     ++src; 
    } 
    return dst; 
} 

這樣,這是保留一次,而不是被複制每次從字符串中刪除一個字符只複製每個字符。然後當你做最後的erase時,它只是從字符串的末尾刪除字符,所以它基本上只是向下調整字符串的長度。