Intereting Posts
Почему возникает ошибка «QDeclarativeComponent: Component is not ready»? fwrite () Коррекция файлов C ++ Разбор SQL-запросов на C ++ с использованием Boost.Spirit «Нет соответствующей функции для вызова« Шаблоны C ++ » Удалить во время итерации std :: vector (косвенно) поврежденная плитка HEIC при преобразовании в JPEG Сравнение поплавков в их битовых представлениях Неопределенная ошибка ссылки, не может создать общую библиотеку #include везде Вызов деструктора, а затем конструктор (сброс объекта) Создание графика с использованием библиотеки Boost, позволяя пользователю выбирать количество вершин Могу ли я использовать memcpy в C ++ для копирования classов, у которых нет указателей или виртуальных функций Создает ли кастинг указатель на шаблон для создания шаблона? Понимание std :: swap (). Какова цель tr1 :: _ Remove_reference? Почему функция друга определяется как часть streamа с расширением struct-boost?

C ++ std :: find с пользовательским компаратором

Это в основном то, что я хочу сделать:

bool special_compare(const string& s1, const string& s2) { // match with wild card } std::vector strings; strings.push_back("Hello"); strings.push_back("World"); // I want this to find "Hello" find(strings.begin(), strings.end(), "hell*", special_compare); // And I want this to find "World" find(strings.begin(), strings.end(), "**rld", special_compare); 

Но std::find не работает, к сожалению. Поэтому, используя только STL, как я могу сделать что-то подобное?

Основываясь на ваших комментариях, вы, вероятно, ищете следующее:

 struct special_compare : public std::unary_function { explicit special_compare(const std::string &baseline) : baseline(baseline) {} bool operator() (const std::string &arg) { return somehow_compare(arg, baseline); } std::string baseline; } std::find_if(strings.begin(), strings.end(), special_compare("hell*")); 

Функция, которую вам нужно использовать, это: std::find_if , потому что std::find не использует функцию сравнения.

Но тогда std::find_if не принимает значения . Вы пытаетесь передать значение и сравнить оба, что меня сбивает с толку. В любом случае, посмотрите документацию . См. Разницу в использовании:

 auto it1 = std::find(strings.begin(), strings.end(), "hell*"); auto it2 = std::find_if(strings.begin(), strings.end(), special_compare); 

Надеюсь, это поможет.

Поскольку никто еще не упомянул std::bind , я предлагаю этот

 #include  bool special_compare(const std::string& s, const std::string& pattern) { // match with wild card } std::vector strings; auto i = find_if(strings.begin(), strings.end(), std::bind(special_compare, std::placeholders::_1, "hell*")); 

Вам понадобится std::find_if() , что неудобно использовать, если вы не используете компилятор C ++ 11. Потому что тогда вам не нужно жестко кодировать значение для поиска в некоторой функции компаратора или реализовать объект-функтор, но может сделать это в выражении lambda:

 vector strings; strings.push_back("Hello"); strings.push_back("World"); find_if(strings.begin(), strings.end(), [](const string& s) { return matches_wildcard(s, "hell*"); }); 

Затем вы пишете match_wildcard () где-нибудь.

С C ++ 11 lambdas:

 auto found = find_if(strings.begin(), strings.end(), [] (const std::string& s) { return /* you can use "hell*" here! */; }); 

Если вы не можете использовать lambdas C ++ 11, вы можете просто создать объект функции самостоятельно. Сделайте оператор типа и перегрузки ().