我有两个容器 - 一个是矢量类型,另一个是unordered_set。
现在,我想检查一下vector中是否有任何元素存在于unordered_set中 - 如 find_first_of 那样 - 并相应地返回true / false。
现在,由于我想利用unordered_set的查找,我想使用 any_of(vector_container.begin(),vector_container.end(),谓词)而不是使用find_first_of。
有没有办法可以使用 boost :: bind 来绑定vector中的元素以从unordered_set中查找,这样我就不必编写谓词类了?
答案 0 :(得分:0)
使用find()
执行此操作非常尴尬,但还有另一种方法:您可以使用unordered_set的count()
函数:
boost::algorithm::any_of(
vector_container.begin(), vector_container.end(),
boost::bind(&boost::unordered_set<int>::count, boost::ref(set_container), _1));
答案 1 :(得分:0)
这是一个稍微懒惰的谓词,使用count(n) == 0
作为“不存在”(和“== 1”作为“存在”):
boost::bind(
std::equal_to<std::size_t>(),
boost::bind(std::mem_fun(&std::unordered_set<int>::count), &s, _1),
0)
这利用了composability of boost::bind
。如果您更详细一点,可以替换find(n) == end()
或find(n) != end()
。
这是一个小小的演示,从矢量中删除集合中的所有元素:
#include <boost/bind.hpp>
#include <unordered_set>
#include <algorithm>
#include <functional>
#include <iostream>
#include <vector>
int main()
{
std::unordered_set<int> s { 1, 2, 3, 4 };
std::vector<int> v { 2, 5, 9, 1 };
v.erase(
std::remove_if(
v.begin(), v.end(),
boost::bind(
std::equal_to<std::size_t>(),
boost::bind(std::mem_fun(&std::unordered_set<int>::count), &s, _1),
1)),
v.end());
for (int n : v) { std::cout << n << "\n"; }
}
答案 2 :(得分:0)
std::any_of(v.begin(), v.end(), boost::bind(&std::set<int>::find, &s, boost::lambda::_1) != s.end());