现有标准的函数对象/函数用于检查等于0吗?

4
我希望能够统计无符号长整型向量中数字 0 的数量。是否有现成的标准函数/函数对象可用于传递给 std::count_if?还是我需要像这个示例一样自己编写它?
class is_equal
{
  private:
    unsigned long int v;
  public:
    is_equal(unsigned long int value) : v(value) {}
    bool operator () (unsigned long int x) { return x == this->v; }
};

unsigned long int count_zero(const std::vector<unsigned long int>& data)
{
  return std::count_if(data.begin(), data.end(), is_equal(0));
}

注意:出于兼容性考虑,我不使用C++11。


4
你可以只用std::count函数,并传入一个数值作为参数。 - BoBTFish
std::bind2ndstd::equal_to怎么搭配使用呢? - Jerry Jeremiah
1
@Bathsheba 在C++11中这个功能已经被弃用,但他没有使用那个版本。无论如何,如果他确实想要相等性检查,使用std::count是更好的建议。我假设他提出的是一个普通问题,在这种情况下他可能需要其他比较器... - Jerry Jeremiah
1
再一次,我不明白为什么会有人对这个问题进行负评。它(i)写得很好,(ii)包含了一些相关的代码,而且(iii)并没有其他重复的问题在大声呼喊要解决。 - Bathsheba
@sleeptightpupper 我同意。bind2nd也是一个可怕的函数。我宁愿编写自己的函数对象,也不想使用bind2nd,但他问是否有标准替代方案...我不应该说什么。 - Jerry Jeremiah
显示剩余6条评论
1个回答

7

std::count(data.begin(), data.end(), v);可以实现这个功能。(如果向量是排序的,你可以使用std::lower_boundstd::upper_bound以O(Log N)的时间获得结果)。

你只需要确保v与向量元素的类型完全相同 - 除非告诉编译器要使用哪个模板实例化。


在一般情况下,equal_to 会更好,因为它可以自动推断类型,但在这种情况下,count 更好。 - uh oh somebody needs a pupper

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接