c ++ is_str_empty谓词

时间:2010-08-20 17:03:51

标签: c++ algorithm boost stl functional-programming

std::vector<std::wstring> lines;
typedef std::vector<std::wstring>::iterator iterator_t;
iterator_t eventLine = std::find_if(lines.begin(), lines.end(), !is_str_empty());

如何定义is_str_empty?我不相信提供它。

5 个答案:

答案 0 :(得分:7)

使用mem_fun / mem_fun_ref:

iterator_t eventLine = std::find_if(lines.begin(), lines.end(),
    std::mem_fun_ref(&std::wstring::empty));

如果你想在字符串非空时,那么:

iterator_t eventLine = std::find_if(lines.begin(), lines.end(),
    std::not1(std::mem_fun_ref(&std::wstring::empty)));

答案 1 :(得分:3)

纯粹的STL就足够了。

#include <algorithm>
#include <functional>

...

iterator_t eventLine = std::find_if(lines.begin(), lines.end(),
                                 std::bind2nd(std::not_equal_to<std::wstring>(), L""));

答案 2 :(得分:3)

使用boost :: lambda和boost :: bind并将其定义为bind(&std::wstring::size, _1))

答案 3 :(得分:3)

您可以使用仿函数:

struct is_str_empty  {
  bool operator() (const std::wstring& s) const  { return s.empty(); }
};

std::find_if(lines.begin(), lines.end(), is_str_empty());  // NOTE: is_str_empty() instantiates the object using default constructor

请注意,如果您想要否定,则必须更改仿函数:

struct is_str_not_empty  {
  bool operator() (const std::wstring& s) const  { return !s.empty(); }
};

或者只是按照KennyTM的建议使用find。

答案 4 :(得分:1)

在c ++ 17中,std::unary_functionremoved,因此也是std::not1std::mem_fun_ref(不是那么现代的compilers care much about that ...)。

使用lambda可能是目前最自然的方式,即

auto eventLine = std::find_if(lines.begin(), lines.end(),
                      [](const std::wstring &s){return !s.empty();});

为了保持@BillyONeal答案的结构,必须使用std::not_fnstd::mem_fn,即:

auto eventLine = std::find_if(lines.begin(), lines.end(),
    std::not_fn(std::mem_fn(&std::wstring::empty)));