假设我有以下定义:

typedef std::vector<std::string> StringVec;
typedef std::set<std::string> StringSet;

以及以下对象:
const StringVec& v
const StringSet& s

我想使用 find_if 来查找 v 中存在于 s 中的第一个字符串。

我最好的行动方针是什么?这可以通过绑定(bind)一些函数调用来避免编写新谓词来完成吗?

编辑:s 非常大,所以 find_first_of 是不可能的。

最佳答案

这是一个基于 set::findboost::bind 的工作示例:

const StringVec& v = {"a", "b", "z"};
const StringSet& s = {"c", "d", "z"};

StringSet::const_iterator (StringSet::*f)(const StringSet::value_type& val) const = &StringSet::find;

StringVec::const_iterator iter = std::find_if(v.begin(), v.end(), boost::bind(f, &s, _1) != s.end());

cout << *iter << endl;

问题是 find 函数有一个 const 重载,所以你必须在 bind 内部进行强制转换或使用 pointer-to-member 来指定你想要的重载。

此外,您必须小心通过对绑定(bind)的引用传递 s,否则它将复制 set 并且返回的 end 迭代器将与您在比较中使用的 end 迭代器不同。

关于c++ - 有效的编程 : How to use find_if without writing the actual predicate,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33985525/

10-11 23:06
查看更多