c – 你如何使用std :: not1和std :: not2?

c – 你如何使用std :: not1和std :: not2?,第1张

概述目前,如果要否定谓词,则必须使用std ::< algorithm> _if_not变体或lambda.但是为了学术,我想知道这是否可行: std::string s("hello");std::find_if(s.begin(), s.end(), std::not1(::ispunct)); 如果不编写自己的函数对象,如何使这段代码工作? 请记住,将字符传递给来自C标准库的字符分类函数(以及 目前,如果要否定谓词,则必须使用std ::< algorithm> _if_not变体或lambda.但是为了学术,我想知道这是否可行:
std::string s("hello");std::find_if(s.begin(),s.end(),std::not1(::ispunct));

如果不编写自己的函数对象,如何使这段代码工作?

解决方法 请记住,将字符传递给来自C标准库的字符分类函数(以及toupper和tolower)的正确方法是首先将其转换为unsigned char,然后再转换为int.

使用std :: ref和reference_wrapper是轻量级的,也是错误的.使用std :: function< bool(int)>或者std :: function< bool(char)>更重量级,也是错误的.在所有这些情况下,字符串中的char直接转换为int,这不是正确的方法.

如果你坚持不使用lambda,那么

std::find_if(s.begin(),std::not1(std::function<bool(unsigned char)>(::ispunct)));

是一种正确的方法.除此以外

std::find_if(s.begin(),[](unsigned char c) { return !ispunct(c); });

更容易理解 – 更短.

总结

以上是内存溢出为你收集整理的c – 你如何使用std :: not1和std :: not2?全部内容,希望文章能够帮你解决c – 你如何使用std :: not1和std :: not2?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1233628.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存