如何绑定一个容器中的元素以调用另一个容器上的成员func

时间:2014-04-14 07:34:14

标签: c++ boost-bind stl-algorithm

我有两个容器 - 一个是矢量类型,另一个是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中查找,这样我就不必编写谓词类了?

3 个答案:

答案 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());