假设我有以下定义:
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::find
和 boost::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/