33

这基本上是我想要做的:

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,我怎么能做这样的事情呢?

4

6 回答 6

36

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

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*"));
于 2013-01-14T16:37:11.110 回答
12

您需要使用的功能是 this : 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);

希望有帮助。

于 2013-01-14T16:24:10.253 回答
10

除非您使用的是 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*");
});

然后你在某处写一个matches_wildcard()。

于 2013-01-14T16:36:16.197 回答
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*"));
于 2013-01-14T17:07:27.440 回答
6

使用 C++11 lambda:

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

如果您不能使用 C++11 lambda,您可以自己制作一个函数对象。制作类型和重载运算符 ()。

于 2013-01-14T16:36:04.667 回答
0

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

class Student {

private:  
  long long m_id;
  // private fields

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

现在假设,我想找到与给定 id 匹配的student对象。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");
于 2021-07-10T15:59:47.260 回答