代码之家  ›  专栏  ›  技术社区  ›  Dustin Getz sunsations

c++是\u str \u空谓词

  •  3
  • Dustin Getz sunsations  · 技术社区  · 14 年前
    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 str \u为空?我不相信boost提供了它。

    5 回复  |  直到 14 年前
        1
  •  7
  •   Billy ONeal IS4    14 年前

    使用mem\u fun/mem\u fun\u 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)));
    
        2
  •  3
  •   kennytm    14 年前

    纯STL就足够了。

    #include <algorithm>
    #include <functional>
    
    ...
    
    iterator_t eventLine = std::find_if(lines.begin(), lines.end(),
                                     std::bind2nd(std::not_equal_to<std::wstring>(), L""));
    
        3
  •  3
  •   UncleZeiv    14 年前

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

        4
  •  3
  •   Karel Petranek    14 年前

    可以使用函子:

    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。

        5
  •  1
  •   ead    6 年前

    在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)));