Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/127.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ c++;是空谓词吗 std::矢量线; typedef std::vector::iterator iterator\u t; 迭代器\u t eventLine=std::find_if(lines.begin(),lines.end(),!is_str_empty());_C++_Algorithm_Boost_Stl_Functional Programming - Fatal编程技术网

C++ c++;是空谓词吗 std::矢量线; typedef std::vector::iterator iterator\u t; 迭代器\u t eventLine=std::find_if(lines.begin(),lines.end(),!is_str_empty());

C++ c++;是空谓词吗 std::矢量线; typedef std::vector::iterator iterator\u t; 迭代器\u t eventLine=std::find_if(lines.begin(),lines.end(),!is_str_empty());,c++,algorithm,boost,stl,functional-programming,C++,Algorithm,Boost,Stl,Functional Programming,我如何定义is_str_为空?我不相信boost提供了它。纯STL就足够了 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()); #包括 #包括 ... 迭代器\u t eventLin

我如何定义is_str_为空?我不相信boost提供了它。

纯STL就足够了

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());
#包括
#包括
...
迭代器\u t eventLine=std::find\u if(lines.begin(),lines.end(),
std::bind2nd(std::not_等于(),L“”);

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

#include <algorithm>
#include <functional>

...

iterator_t eventLine = std::find_if(lines.begin(), lines.end(),
                                 std::bind2nd(std::not_equal_to<std::wstring>(), L""));
请注意,如果要求反,则必须更改函子:

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

或者按照肯尼特的建议使用find。

使用mem\u-fun/mem\u-fun\u-ref:

struct is_str_not_empty  {
  bool operator() (const std::wstring& s) const  { return !s.empty(); }
};
如果希望字符串不为空,则:

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

在c++17中,
std::一元函数
是,因此也
std::not1
std::mem\u-fun\u-ref
(不是那么现代…)

使用lambda可能是现在最自然的方式,即

iterator_t eventLine = std::find_if(lines.begin(), lines.end(),
    std::not1(std::mem_fun_ref(&std::wstring::empty)));
为了保持@BillyONeal答案的结构,必须使用和,即:


这将告诉你哪些字符串不是空的,哪些字符串不是空的。我仍然更喜欢mem_fun_ref解决方案,但这很有效+1.
auto eventLine = std::find_if(lines.begin(), lines.end(),
                      [](const std::wstring &s){return !s.empty();});
auto eventLine = std::find_if(lines.begin(), lines.end(),
    std::not_fn(std::mem_fn(&std::wstring::empty)));