计算元素个数(count和count_if)

本文详细解析了C++标准模板库中的count与count_if函数的使用方法及内部实现原理。count函数用于计算指定范围内等于特定值的元素数量,而count_if则用于计算满足某一条件的元素个数,通过实例展示了这两个函数的应用场景。

count

  计算first和last之间与value相等于元素个数

template <class InputIterator,class EqualityComparable>
typename iterator_traits<_InputIterator>::difference_type
count (InputIterator first,InputIterator last,const EqualityComparable &value);

count_if

  与count相似,但是count_if是计算满足某种条件的元素的个数,满足pred(*i)为true的iterator i的个数

template<typename _InputIterator, typename _Predicate>
    typename iterator_traits<_InputIterator>::difference_type
    __count_if(_InputIterator __first, _InputIterator __last, _Predicate __pred)
    {
      typename iterator_traits<_InputIterator>::difference_type __n = 0;
      for (; __first != __last; ++__first)
            if (__pred(__first))
                  ++__n;
      return __n;
    }

 

转载于:https://www.cnblogs.com/tianzeng/p/10403400.html

### C++ 中 `std::set` 的 `count` 方法 在 C++ 标准库中,`std::set` 是一种关联容器,用于存储唯一的键值并自动保持有序。对于 `std::set` 容器而言,其 `count` 成员函数的行为与其他一些容器(如 `std::vector` 或 `std::list`)有所不同。 #### 关于 `std::set::count` - 对于 `std::set` `std::multiset` 而言,`count` 函数的作用是用来统计指定元素在集合中的数量。 - 需要注意的是,在 `std::set` 中,由于不允许重复的元素存在,因此调用 `count(key)` 时返回的结果要么是 **0**(表示该元素不存在),要么是 **1**(表示该元素唯一存在于集合中)。而对于允许重复元素的 `std::multiset`,则会返回实际存在的次数[^1]。 以下是具体的代码示例: ```cpp #include <iostream> #include <set> using namespace std; int main() { set<int> mySet = {1, 2, 3, 4, 5}; // 测试是否存在某个元素 int key_present = 3; if (mySet.count(key_present)) { cout << "Element " << key_present << " is present." << endl; } int key_absent = 6; if (!mySet.count(key_absent)) { cout << "Element " << key_absent << " is not present." << endl; } return 0; } ``` 上述程序展示了如何通过 `count` 来判断特定元素是否存在于 `std::set` 中。如果目标元素存在,则返回值为 1;否则返回值为 0[^2]。 --- ### 运行结果解释 假设我们有如下初始化操作以及后续逻辑处理: ```cpp set<int> s; // 创建一个空的 set int a[] = {8, 3, 1, 10, 6, 4, 7, 14, 13}; for(auto& e : a){ s.insert(e); } // 输出插入后的所有元素 for(auto& e : s){ cout << e << " "; } cout << endl; // 查找并删除元素 '3' set<int>::iterator pos = s.find(3); if(pos != s.end()){ s.erase(pos); } // 删除后重新遍历输出剩余元素 for(auto& e : s){ cout << e << " "; } cout << endl; ``` 此段代码执行完毕之后将会打印两行数据。第一行为原始数组经过去重排序后的结果即 `{1, 3, 4, 6, 7, 8, 10, 13, 14}` ,第二行为移除掉数值 `'3'` 后剩下的部分即 `{1, 4, 6, 7, 8, 10, 13, 14}` 。这里需要注意每次向 `set` 插入新项都会被自动排列成升序状态,并且不会有任何重复条目出现。 --- ### 总结 尽管 `std::set` 提供了 `count` 方法作为接口之一,但由于它本质上是一个无重复性的结构体设计模式下产物,所以它的用途相对有限——仅仅用来确认某单一对象的存在与否而已。而当涉及到多实例计数需求场景时,则应该考虑采用其他类型的 STL 数据结构比如 `std::multiset` 或者哈希表类实现方式等替代方案。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值