2015-11-08 213 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时,它只是从字符串的末尾删除字符,所以它基本上只是向下调整字符串的长度。