C ++ std :: find使用自定义比较器

时间:2013-01-14 16:19:20

标签: c++ stl

这基本上就是我想做的事情:

bool special_compare(const string& s1, const string& s2)
{
    // match with wild card
}

std::vector<string> 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,我该怎么做呢?

6 个答案:

答案 0 :(得分:30)

根据您的评论,您可能正在寻找:

struct special_compare : public std::unary_function<std::string, bool>
{
  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*"));

答案 1 :(得分:10)

您需要使用的功能是:std::find_if,因为std::find不采用比较功能。

但是std::find_if没有。你试图传递比较两者,这让我感到困惑。无论如何,请看documentation。看看用法的区别:

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

希望有所帮助。

答案 2 :(得分:7)

除非你使用的是C ++ 11编译器,否则你需要使用std::find_if(),这是不方便的。因为那时,你不需要在一些比较器函数中硬编码值来搜索或实现一个仿函数对象,但是可以在lambda表达式中进行:

vector<string> 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()。

答案 3 :(得分:7)

由于还没有人提及std::bind,我建议这个

#include <functional>

bool special_compare(const std::string& s, const std::string& pattern)
{
    // match with wild card
}

std::vector<std::string> strings;
auto i = find_if(strings.begin(), strings.end(), std::bind(special_compare, std::placeholders::_1, "hell*"));

答案 4 :(得分:5)

使用C ++ 11 lambdas:

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

如果你不能使用C ++ 11 lambdas,你可以自己创建一个函数对象。创建一个类型和重载operator()。

答案 5 :(得分:0)

我想要一个具有自定义查找逻辑的自定义类的示例,但没有找到任何类似的答案。所以我写了这个答案,它使用自定义比较器函数 (C++11) 来查找对象。

class Student {

private:  
  long long m_id;
  // private fields

public:
  long long getId() { return m_id; };
  
};

现在假设,我想找到 student 与给定 id 匹配的 m_id 对象。我可以这样写std::find_if

// studentList is a vector array

long long x_id = 3; // local variable
auto itr = std::find_if(studentList.begin(), studentList.end(),
                    [x_id](Student& std_val) 
                    { return std_val.getId() == x_id; }
                    );

if(itr == studentList.end())
  printf("nothing found");