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?我不相信提供它。
答案 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)
#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_function
是removed,因此也是std::not1
和std::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_fn
和std::mem_fn
,即:
auto eventLine = std::find_if(lines.begin(), lines.end(),
std::not_fn(std::mem_fn(&std::wstring::empty)));