C++常用算术生成算法剖析

2023-11-09

C++STL库中常用生成算术算法有 accumulate 和 fill

在调用这些算法之前需要包含头文件 #include <numeric> 这个头文件很小,因为算法比较少

1.accumulate

accumulate(iterator beg, iterator end, value); - 第三个参数value是起始累加值 能指定起始累加起始值。

accumulate的底层十分简单,就是用一个for循环通过迭代器访问区间元素

template<class _InIt,
	class _Ty,
	class _Fn2> inline
	_Ty _Accumulate(_InIt _First, _InIt _Last, _Ty _Val, _Fn2 _Func)
	{	// return sum of _Val and all in [_First, _Last), using _Func
	for (; _First != _Last; ++_First)
		_Val = _Func(_Val, *_First);
	return (_Val);
	}

如果你没有指定function,没写第四个参数 for循环内部也就是在执行 value += *_First;

这个_Frist是你的起始迭代器,循环结束条件为 _First!=_Last。

下面是使用案例:

统计一组人员的年龄总和

class Person
{
public:
	Person(string name, int age)
	{
		this->m_Age = age;
		this->m_Name = name;
	}

	string m_Name;
	int m_Age;
};

class AddPerson
{
public:
	int operator()(int val, const Person &p1)
	{
		return val + p1.m_Age;
	}
};

void Test1()
{
	vector<Person> v;
	
	Person p1("张三", 20);
	Person p2("李四", 25);
	Person p3("王五", 23);
	Person p4("赵六", 22);
	Person p5("yrl", 21);
	Person p6("xhc", 20);

	v.push_back(p1);
	v.push_back(p2);
	v.push_back(p3);
	v.push_back(p4);
	v.push_back(p5);
	v.push_back(p6);
	
	int total = accumulate(v.begin(), v.end(), 0, AddPerson());
	cout << "容器中所有人的年龄总和为:" << total << endl;
}

int main()
{
	Test1();

	system("pause");
	return 0;
}

输出结果:

2.fill

fill(iterator beg, iterator end, value);  - 第三个参数是你要填充的值

fill的底层也很简单

底层是一个for循环 拿到迭代器 *first = value 然后 迭代器往后走

下面是fill的使用案例:

后期想要重新填充容器中的元素

class Print
{
public:
	void operator()(int val)
	{
		cout << val << " ";
	}
};

void Test1()
{
	vector<int> v;
	v.resize(10); // 10个0

	//后期重新填充
	fill(v.begin(), v.end(), 100);

	for_each(v.begin(), v.end(), Print());
	cout << endl;
}

int main()
{
	Test1();

	system("pause");
	return 0;
}

输出结果:

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++常用算术生成算法剖析 的相关文章

随机推荐

  • Protobuf下载和编译

    系列导航 一 Protobuf下载和编译 二 Protobuf在Java中的简单使用 一 简介 protobuf全称Google Protocol Buffers 是google开发的的一套用于数据存储 网络通信时用于协议编解码的工具库 是
  • C#中导出百万级Excel只需几秒除了NPOI还可以这样

    场景 Winform中通过NPOI导出Excel的三种方式 HSSFWorkbook XSSFWorkbook SXSSFWorkbook 附代码下载 https blog csdn net BADAO LIUMANG QIZHI arti
  • 剪格子 蓝桥杯 211

    题目描述 如下图所示 3 x 3 的格子中填写了一些整数 我们沿着图中的红色线剪开 得到两个部分 每个部分的数字和都是 60 本题的要求就是请你编程判定 对给定的 m n 的格子中的整数 是否可以分割为两个部分 使得这两个区域的数字和相等
  • com.alibaba.fastjson.JSONArray cannot be cast to com.alibaba.fastjson.JSONObject

    json中类型转换问题 是错误的格式 例 JSONObject parseObject type slider show true start 1 end 100 正确的写法 JSONObject dataZoom new JSONObje
  • C# 委托(delegate)

    1 什么是委托 委托是一种引用类型 它是函数指针的托管版本 在C 中 委托是一种可以把引用存储为函数的类型 委托可以引用实例和静态方法 而函数指针只能引用静态方法 委托的声明非常类似于函数 和函数不同的的是委托不带函数体 并且需要Deleg
  • 初识Spring Boot

    目录 一 Spring Boot是什么 二 创建Spring Boot项目 1 使用IDEA创建 2 网页版创建 三 运行项目 一 Spring Boot是什么 简单来说Spring Boot就是Spring的 脚手架 就是一个框架 Spr
  • nodejs libuv学习

    读了一下libuv源代码 简单记录一些见解 https github com libuv libuv libev就是一个基于epoll封装事件的函数库 自身不带有线程池等操作 而libuv则是在libev基础上 加上线程操作的功能 大体运作
  • Java中Array.sort()的几种用法

    转载https www tuicool com articles iii6N3 Java的Arrays类中有一个sort 方法 该方法是Arrays类的静态方法 在需要对数组进行排序时 非常的好用 但是sort 的参数有好几种 下面我就为大
  • 【QT控件大小自适应窗口变化】

    问题 刚开始学习QT时 在窗口中放置一个个控件 而后运行程序 会发现改变窗口大小时 控件大小不随窗口大小变化而变化 导致窗口大小变化没意义 同时也让精心布局看起来很难看 本文提供一种使用BoxLayout中放置控件 所有可见控件能够随窗口大
  • 同仁堂-十大王牌、十大名药

    同仁堂 十大王牌 十大名药 官网 ZY123 com 中医123
  • WPS中编辑Word删除内容之后保存退出了如何恢复?

    目录 一 问题简述 二 Word用户 场景一 情况一 删除了内容没有退出文档 情况二 删除了内容退出文档 情况三 删除了文件退出文档 三 Wps用户 场景二 情况一 删除了内容没有退出文档 情况二 删除了内容退出文档 情况三 删除了文件退出
  • PAT 5 剪邮票

    剪邮票 如 图1 jpg 有12张连在一起的12生肖的邮票 现在你要从中剪下5张来 要求必须是连着的 仅仅连接一个角不算相连 比如 图2 jpg 图3 jpg 中 粉红色所示部分就是合格的剪取 请你计算 一共有多少种不同的剪取方法 请填写表
  • Flink从入门到真香(18、使用flink table api 从文件和kafka中读取数据)

    还是一样 要先引入依赖 在pom xml
  • java 数组排序(冒泡排序、快速排序、简单排序)

    目录 1 冒泡排序 2 快速排序 3 简单排序 1 冒泡排序 简介 1 循环遍历数组 判断相邻两个元素大小如果满足条件list x gt list x 1 则将两个元素位置对换 2 重复步骤 1 判断初始元素向右依次递减 3 一般有两层循环
  • win10桌面计算机不显示桌面,win10桌面不见了,win10桌面显示不了任何程序

    解决方法 首先 由于图标缓存文件是隐藏文件 我们需要在资源管理器中将zd设置改为 显示所有文件 操作方法 1 随便打开一个文件夹 2 点击 查看 菜单 然后勾选 隐藏的项目 同时按下快捷键 Win R 在打开的运行窗口中输版入 locala
  • 怎么分析用户活跃、指标波动

    相关文章 用户画像 3种标签类型 8大系统模块 知道用户画像标签有哪些维度 应用场景体系 是种什么样的体验 用户运营 用户分析 店铺数据分析 小程序数据分析 思维导图 数据分析全知识 思维导图 Xmind思维导图 常用快捷键使用 参考作者
  • 计算机视觉:图像检测和图像分割有什么区别?

    人工智能中的图像处理 人工智能对于图像处理有不同的任务 在本文中 我将介绍目标检测和图像分割之间的区别 在这两个任务中 我们都希望找到图像中某些感兴趣的项目的位置 例如 我们可以有一组安全摄像头照片 在每张照片上 我们想要识别照片中所有人的
  • 怎么查看mysql密码

    MySQL数据库查看密码的方法如下 以系统管理员身份运行cmd 查看mysql是否已经启动 如果已经启动 就停止 net stop mysql 切换到MySQL安装路径下 D WAMPMySQL 5 6 36in 如果已经配了环境变量 可以
  • LLVM-Clang编译器安装和使用

    LLVM不仅仅是一个编译器 同时提供了模块化的功能和库 用于编译器的开发和功能扩展 常规的一个编译器分为前端 优化器和后端 LLVM编译器也不例外 Clang就是属于一个编译器的前端部分 LLVM属于优化器和后端 当然LLVM也可以支持其他
  • C++常用算术生成算法剖析

    C STL库中常用生成算术算法有 accumulate 和 fill 在调用这些算法之前需要包含头文件 include