我一直在更新我几乎两年前写过的程序,并且遇到了一个调用来从字符串中删除所有标点符号和空格。删除标点符号查询
该调用工作正常,但我不确定它是否是最有效的方法。
的代码行低于:
tempMessage.erase(remove_if(tempMessage.begin(), tempMessage.end(), (int(*)(int))ispunct), tempMessage.end());
我没有,我想出了这个或它是如何放在一起回味,但我希望能够充分理解这一呼吁。
我得到的std :: string.erase摆脱了第一个参数,直到第二个参数。我还可以看到remove_if是如何定义开始点和结束点的,但任何人都可以告诉我remove_if调用的第三个参数来自哪里?
我不记得为什么我的生活需要(int(*)(int))。
在查看代码时,任何人都可以改进它,或使其更高效吗?
谢谢
看来我当时正在寻找一个快速解决方案,而且这样做的确如此。你能解释一下你在答案中定义的结构吗?它看起来像是返回true,如果char是一个punct字符,但我不明白ispunct调用之前的两个分号。我也不是很熟悉bool操作符()const的实现。你还可以扩展这个吗?麻烦抱歉。 – Matthew
没问题。 '::'是一个范围解析运算符。它只是确保我们从''得到'ispunct',而不是另一个。 (这里不需要)'bool operator()(...)'是一个函数调用操作符:它意味着编译器可以像调用函数一样“调用”对象。这样的对象被称为功能对象或函子,并且广泛用于C++。 –
只是为了我自己的清晰。如何将一个'char'传递给'int ispunct(int ch)'未定义的行为,但传递一个'unsigned char'是* not *?前者是否不在标准(4.5/4.7)中整体促销的结果范围内,如果不是,后者又如何? – WhozCraig