当前位置: 首页 > news >正文

(2)STL算法之元素计数

2、元素计数算法

STL提供了两个计数功能的算法,分别是count(),以及条件计数的算法count_if();

【count()原型】

template <class InputIterator, class T>

typename iterator_traits<InputIterator>::difference_type

count (InputIterator first, InputIterator last, const T& val);

该函数模板行为等效于以下:

template <class InputIterator,class T>
typename iterator_traits<InputIterator>::difference_type
count(InputIterator first, InputIterator last, const T& val)
{
	typename iterator_traits<InputIterator>::difference_type ret = 0;
	while (first != last)
	{
		if (*first == val)
		{
			++ret;
			++first;
		}
	}
	return ret;
}

 

【count_if()原型】

template <class InputIterator, class UnaryPredicate>

typename iterator_traits<InputIterator>::difference_type

count_if (InputIterator first, InputIterator last, UnaryPredicate pred);

template <class InputIterator, class UnaryPredicate>
typename iterator_traits<InputIterator>::difference_type
count_if(InputIterator first, InputIterator last, UnaryPredicate pred) //pred 为 true时,才统计元素个数,参数3应该是一个bool类型的函数对象
{
    typename iterator_traits<InputIterator>::difference_type ret = 0;
    while (first != last) {
        if (pred(*first)) ++ret;
        ++first;
    }
    return ret;
}

示例一

#include <iostream>     
#include <algorithm>    
#include <vector>       

int main() {
    // counting elements in array:
    int myints[] = { 10,20,30,30,20,10,10,20 };   
    int mycount = std::count(myints,   myints + 8    , 10);
    std::cout << "10 appears " << mycount << " times.\n";

    // counting elements in container:
    std::vector<int> myvector(myints,    myints + 8    );
    mycount = std::count(myvector.begin(), myvector.end(), 20);
    std::cout << "20 appears " << mycount << " times.\n";

    return 0;
}

示例二

#include <iostream>
#include <vector>
#include <algorithm>
#include <functional>
using namespace std;

template<class T>
void init_value(T& vect, int first, int last)
{
	if (last > first)
	{
		for (int i = first; i <= last; ++i)
		{
			vect.insert(vect.end(), i);  //尾插
		}
	}
}

void Print(int elem)
{
	cout << elem << " ";
}

bool pred(int elem)
{
	return elem % 2 == 0;   //是否是偶数
}

void main()
{
	vector<int> myvector;
	init_value(myvector, 1, 10);
	for_each(myvector.begin(), myvector.end(), Print);
	cout << endl;

	int ct = count(myvector.begin(), myvector.end(), 4);  //统计等于 4 的数的个数
	int ct_if = count_if(myvector.begin(), myvector.end(), pred);  //统计偶数的个数
	int ct_if1 = count_if(myvector.begin(), myvector.end(), bind2nd(greater<int>(), 2)); //统计大于 2 的个数
	cout << "ct " << ct << endl;   // 1
	cout << "ct_if " << ct_if << endl;  // 5
	cout << "ct_if1  " << ct_if1 << endl;   8
}

这里的bind2nd(greater<int>(), 2)  可以参考 C++11中的std::bind

相关文章:

  • (3)STL算法之搜索
  • STL算法
  • (4)STL算法之比较
  • linux中实现线程同步的6种方法
  • Linux TCP通信示例
  • QtTCP通信示例
  • (5)STL算法之复制
  • (6)STL算法之转换
  • (7)STL算法之交换赋值
  • 菱形继承问题
  • 改善程序与设计的N个做法
  • C++数据结构之顺序表
  • C++数据结构之单链表
  • (8)STL算法之替换
  • (9)STL算法之逆转旋转
  • [NodeJS] 关于Buffer
  • 「面试题」如何实现一个圣杯布局?
  • 11111111
  • github从入门到放弃(1)
  • JAVA SE 6 GC调优笔记
  • JavaScript 无符号位移运算符 三个大于号 的使用方法
  • JAVA并发编程--1.基础概念
  • maya建模与骨骼动画快速实现人工鱼
  • MyEclipse 8.0 GA 搭建 Struts2 + Spring2 + Hibernate3 (测试)
  • spark本地环境的搭建到运行第一个spark程序
  • vue.js框架原理浅析
  • 阿里云ubuntu14.04 Nginx反向代理Nodejs
  • 分布式熔断降级平台aegis
  • 关于 Cirru Editor 存储格式
  • 关于 Linux 进程的 UID、EUID、GID 和 EGID
  • 官方解决所有 npm 全局安装权限问题
  • 看完九篇字体系列的文章,你还觉得我是在说字体?
  • 离散点最小(凸)包围边界查找
  • 面试题:给你个id,去拿到name,多叉树遍历
  • 容器服务kubernetes弹性伸缩高级用法
  • 使用 QuickBI 搭建酷炫可视化分析
  • 腾讯视频格式如何转换成mp4 将下载的qlv文件转换成mp4的方法
  • 为视图添加丝滑的水波纹
  • 关于Android全面屏虚拟导航栏的适配总结
  • ​Base64转换成图片,android studio build乱码,找不到okio.ByteString接腾讯人脸识别
  • #define用法
  • #Lua:Lua调用C++生成的DLL库
  • #QT(智能家居界面-界面切换)
  • (14)Hive调优——合并小文件
  • (30)数组元素和与数字和的绝对差
  • (android 地图实战开发)3 在地图上显示当前位置和自定义银行位置
  • (附源码)springboot工单管理系统 毕业设计 964158
  • (附源码)计算机毕业设计ssm高校《大学语文》课程作业在线管理系统
  • (三分钟)速览传统边缘检测算子
  • (十)T检验-第一部分
  • (推荐)叮当——中文语音对话机器人
  • (转)Linux NTP配置详解 (Network Time Protocol)
  • ***详解账号泄露:全球约1亿用户已泄露
  • .Net Core和.Net Standard直观理解
  • .NET关于 跳过SSL中遇到的问题