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

前端之家收集整理的这篇文章主要介绍了c – 你如何使用std :: not1和std :: not2?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
目前,如果要否定谓词,则必须使用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); });

更容易理解 – 更短.

原文链接:https://www.f2er.com/c/115716.html

猜你在找的C&C++相关文章