如何在find_if谓词中引用迭代器?

Mac*_*gma 3 c++ iterator

我想确保一个字符串至少有一个alpha.简单:

if ( find_if(field_name.begin(), field_name.end(), isalpha) == field_name.end() )
Run Code Online (Sandbox Code Playgroud)

但我想用一个locale.我知道我可以轻松编写一个单独的函数,但我更喜欢在find_if中使用它.也就是说,

include <locale>

std::locale loc;

if ( find_if(field_name.begin(), field_name.end(), isalpha(*this_iterator,loc) == field_name.end() )
Run Code Online (Sandbox Code Playgroud)

问题:有没有什么可以this_iterator参考当时的迭代器?

Lil*_*ard 7

在C++ 11中,你可以像Timo建议的那样使用lambda,或者使用std::bind(),如同std::bind(isalpha, std::placeholders::_1, loc).

预C++ 11,你可以std::bind2nd()改用.这有点复杂,因为它需要一个unary_functionbinary_function作为参数,而不是任何旧的函数对象.我们可以创建一个std::ptr_fun(),虽然由于某种原因我们需要明确告诉它模板参数是什么.我们需要使用std::isalpha()而不是isalpha()为了获得启用语言环境的版本.所以完整的表达看起来像

std::bind2nd(std::ptr_fun<char, const std::locale&, bool>(std::isalpha), loc)
Run Code Online (Sandbox Code Playgroud)

不用说,C++ 11版本非常简单.


顺便说一句,如果您使用的是C++ 11,那么您可以使用std::any_of(...)而不是std::find_if(...) == foo.end().它应该表现相同,但稍微更具可读性.


Tim*_*sch 6

在C++ 11中,您可以使用lambda:

if (std::find_if(field_name.begin(), field_name.end(),
                 [&loc](char c)
                 {
                   return isalpha(c, loc);
                 }) == field_name.end())
{
  ...
}
Run Code Online (Sandbox Code Playgroud)

在pre-C++ 11中,您可能必须使用boost :: bind或boost :: lambda之类的东西来实现相同的功能.