предикат c ++ is_str_empty - PullRequest
       4

предикат c ++ is_str_empty

3 голосов
/ 20 августа 2010
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?Я не верю, что Boost его поставляет.

Ответы [ 5 ]

7 голосов
/ 20 августа 2010

Использовать 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)));
3 голосов
/ 20 августа 2010

Используйте boost :: lambda и boost :: bind и определите его как bind(&std::wstring::size, _1))

3 голосов
/ 20 августа 2010

Вы можете использовать функтор:

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.

3 голосов
/ 20 августа 2010

Чисто STL достаточно.

#include <algorithm>
#include <functional>

...

iterator_t eventLine = std::find_if(lines.begin(), lines.end(),
                                 std::bind2nd(std::not_equal_to<std::wstring>(), L""));
1 голос
/ 24 октября 2018

В c ++ 17 std::unary_function удалено , удалено и, следовательно, также std::not1 и std::mem_fun_ref (не то, чтобы современные компиляторы заботились об этом ...). 1008 *

Использование лямбды было бы, вероятно, наиболее естественным способом, т. Е.

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