STL泛型算法介绍之count/count_if

本文主要介绍STL中count,count_if的用法

在C++编程中,有时会遇到统计类的问题,统计满足特定条件的数目,此时可以用std::count与std::count_if,他们定义在头文件<algorithm>中,使用时要include该头文件。

std::count用于统计容器中指定元素的数目,其实现如下:

template <class InputIterator, class T>

  _TYPENAME iterator_traits<InputIterator>::difference_type

  count (InputIterator first, InputIterator last, const T& value)

  {

    typename iterator_traits<InputIterator>::difference_type n = 0; //RW_BUG: fix for bts-42842

    while (first != last)

      if (*first++ == value) ++n;

    return n;

  }

std::count_if用于统计容器中符合特定条件的数目,其实现如下:

template <class InputIterator, class Predicate>

  _TYPENAME iterator_traits<InputIterator>::difference_type

  count_if (InputIterator first, InputIterator last, Predicate pred)

  {

    typename iterator_traits<InputIterator>::difference_type n = 0; //RW_BUG: fix for bts-42842

    while (first != last)

      if (pred(*first++)) ++n;

    return n;

  }

用法举例

   

 std::vector<int> vec1 = {10,20,30,40,50,60,50,60,50};

    auto cnt1 =  std::count(vec1.begin(), vec1.end(),50);

    auto cnt2 =  std::count(vec1.begin(), vec1.end(),150);

    std::cout << "count(==50): " << cnt1 << " count(==100):" << cnt2 <<  std::endl;

    auto cnt3 = std::count_if(vec1.begin(), vec1.end(),

                                [&](int value){ return value > 40;});

    auto cnt4 = std::count_if(vec1.begin(), vec1.end(),

                                [&](int value){ return value > 150;});

    std::cout << "count (>40): " << cnt3 << " count(>150):" << cnt4 << std::endl;



运行结果:

count(==50): 3 count(==100):0

count (>40): 5 count(>150):0

std::count与std::count_if用法比较简单,算法复杂度为O(n),主要用于序列式容器(sequence containers, 比如vector,list,stack,queue等)。对于关联式容器(associative comtainers,比如set,map等),有更高效的查找方式,这个后续会介绍。

std::count_if 是 STL 中的一个算法,用于对容器中的元素进行条件统计。它的函数原型如下: ```c++ template <class InputIterator, class Predicate> typename iterator_traits<InputIterator>::difference_type count_if(InputIterator first, InputIterator last, Predicate pred); ``` 其中,first 和 last 分别表示容器中要进行统计的元素范围,pred 是一个谓词函数,用于对容器中的每个元素进行判断。count_if 函数会遍历容器中的每个元素,对每个元素都调用谓词函数 pred 进行判断,如果返回值为 true,则该元素被认为是符合条件的,计入统计结果。 count_if 函数返回符合条件的元素个数,其类型为 iterator_traits<InputIterator>::difference_type,表示两个迭代器之间的距离,通常是一个整型数。 下面是一个简单的例子,用于说明 std::count_if 算法的用法: ```c++ #include <iostream> #include <vector> #include <algorithm> bool isOdd(int num) { return num % 2 == 1; } int main() { std::vector<int> vec = {1, 2, 3, 4, 5}; // 使用 std::count_if 算法和 isOdd 谓词函数,统计 vec 中奇数的个数 int count = std::count_if(vec.begin(), vec.end(), isOdd); std::cout << "Count: " << count << std::endl; return 0; } ``` 在这个例子中,我们定义了一个谓词函数 isOdd,用于判断一个数是否为奇数。然后,我们使用 std::count_if 算法和 isOdd 谓词函数来统计 vec 容器中奇数的个数。在调用 std::count_if 算法时,需要传入谓词函数 isOdd 作为第三个参数,表示对容器中的每个元素都要调用该函数进行判断。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

攻城狮Soar

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值