Intereting Posts
Как избежать чтения комментариев в текстовом файле? Почему не отладчик Visual Studio 2010 См. Статические члены classа const? Если виртуальная таблица создается во время компиляции, то почему мы называем это polymorphismом времени выполнения? Преобразование путей физических дисков с использованием C ++ Изменение прямоугольной кнопки Qt для округления Как заставить функцию получать multidimensional array произвольного размера в C ++? Как обрабатывать изменяющиеся структуры данных при обновлении версии программы? Тонкая декомпозиция QR в c ++ Есть ли чистый способ вывода текста в панель отладки? Как проверить, начинается ли C ++ с определенной строки и преобразует подстроку в int? Связывание libCurl в QT дает огромный список ошибок C ++ встраивание звука в исполняемый файл в C ++ Могу ли я использовать библиотеку boost для выполнения кроссплатформенного приложения? ifstream не откроет файл OpenCV – Резкое увеличение частоты кадров при воспроизведении

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, вы можете просто создать объект функции самостоятельно. Сделайте оператор типа и перегрузки ().