gpt4 book ai didi

c++ - 从 C++ 字符串中删除特殊字符(' 和 - 除外)

转载 作者:行者123 更新时间:2023-12-02 09:51:15 30 4
gpt4 key购买 nike

这个问题在这里已经有了答案:





How to remove certain characters from a string in C++?

(15 个回答)


2年前关闭。




我正在尝试使用 isWordChar() 方法从字符串中删除特殊字符。但是,我需要保留两个特殊字符,“'”和“-”,例如“isn't”中的撇号和mother-in-law 中的连字符。这是我要实现的:

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;
}

在我的 bool 值中添加特殊情况后,我似乎无法正确添加异常。任何提示或建议?谢谢!

最佳答案

我会使用删除/删除习语:

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

关于c++ - 从 C++ 字符串中删除特殊字符(' 和 - 除外),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33600449/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com