C++之STL的algorithm(5)之生成算法(accumulate、fill)整理

2024-04-04 11:52

本文主要是介绍C++之STL的algorithm(5)之生成算法(accumulate、fill)整理,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

C++之STL的algorithm(5)之生成算法(accumulate、fill)整理

注:整理一些突然学到的C++知识,随时mark一下
例如:忘记的关键字用法,新关键字,新数据结构


C++ 的遍历算法整理

  • C++之STL的algorithm(5)之生成算法(accumulate、fill)整理
  • 一、生成算法
    • 1、accumulate累加算法
    • 2、fill 填充算法
  • 总结


提示:本文为 C++ 中accumulate、fill 的写法和举例


一、生成算法

1、accumulate累加算法

accumulate 是 <numeric> 头文件中的一个算法,用于计算容器(或其他迭代器范围)中所有元素的累计总和。它也可以接受一个二元操作符,用于自定义元素的累积方式。

参数:

first, last:输入序列的开始和结束迭代器。
init:累积求和的初始值。
binary_op(可选):二元操作符,用于计算两个元素的和。默认为 std::plus<>(),即加法操作符。

返回值:

返回一个值,表示从 init 开始的累积结果。
示例:

对于 std::vector:

#include <iostream>  
#include <vector>  
#include <numeric>  int main() {  std::vector<int> vec = {1, 2, 3, 4, 5};  int sum = std::accumulate(vec.begin(), vec.end(), 0); // 使用默认加法操作符  std::cout << "Sum of vector elements: " << sum << std::endl; // 输出:15  return 0;  
}

对于 std::map:
由于 std::map 存储的是键值对,通常我们不直接计算所有值的和,但如果你确实想这样做,你可以使用 std::accumulate 遍历 map 的值部分:

#include <iostream>  
#include <map>  
#include <numeric>  int main() {  std::map<int, int> myMap = {{1, 10}, {2, 20}, {3, 30}};  int sum = std::accumulate(myMap.begin(), myMap.end(), 0,   [](int init, const std::pair<int, int>& p) {  return init + p.second; // 累加值  });  std::cout << "Sum of map values: " << sum << std::endl; // 输出:60  return 0;  
}

对于 std::set:
通常 std::set 用于存储唯一的元素,而不常计算它们的和。但如果确实想计算 set 中所有元素的和(例如,如果 set 存储的是整数),可以这样做:

#include <iostream>  
#include <set>  
#include <numeric>  int main() {  std::set<int> mySet = {1, 2, 3, 4, 5};  int sum = std::accumulate(mySet.begin(), mySet.end(), 0);  std::cout << "Sum of set elements: " << sum << std::endl; // 输出:15  return 0;  
}

2、fill 填充算法

fill 是 <algorithm> 头文件中的一个算法,用于向容器(或其他迭代器范围)中添加(或替换)相同的元素。

参数:

first, last:要填充的序列的开始和结束迭代器。
value:要填充的值。

返回值:

该函数没有返回值,但会修改传入的序列。

示例:

对于 std::vector:

#include <iostream>  
#include <vector>  
#include <algorithm>  int main() {  std::vector<int> vec(5); // 创建一个包含5个元素的vector,默认初始化为0  std::fill(vec.begin(), vec.end(), 7); // 用7填充整个vector  for (int num : vec) {  std::cout << num << ' '; // 输出:7 7 7 7 7  }  std::cout << std::endl;  return 0;  
}

对于 std::map:
std::map 的元素是键值对,因此你不能简单地用 std::fill 填充整个 map。但你可以遍历 map 并修改其值部分:

#include <iostream>  
#include <map>  
#include <algorithm>  int main() {  std::map<int, int> myMap = {{1, 10}, {2, 20}, {3, 30}};  for (auto& pair : myMap) {  pair.second
pair.second = 50; // 将所有值设置为50
}
// 使用 std::for_each 打印结果,因为 std::map 不保证顺序
std::for_each(myMap.begin(), myMap.end(), [](const std::pair<int, int>& p) {
std::cout << p.first << ": " << p.second << std::endl;
});
return 0;
}

对于 std::set: 由于 std::set 存储的是唯一的元素,你不能使用 std::fill 直接填充整个集合,因为这不符合集合的唯一性约束。

总结

这篇关于C++之STL的algorithm(5)之生成算法(accumulate、fill)整理的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/875710

相关文章

MybatisGenerator文件生成不出对应文件的问题

《MybatisGenerator文件生成不出对应文件的问题》本文介绍了使用MybatisGenerator生成文件时遇到的问题及解决方法,主要步骤包括检查目标表是否存在、是否能连接到数据库、配置生成... 目录MyBATisGenerator 文件生成不出对应文件先在项目结构里引入“targetProje

Python使用qrcode库实现生成二维码的操作指南

《Python使用qrcode库实现生成二维码的操作指南》二维码是一种广泛使用的二维条码,因其高效的数据存储能力和易于扫描的特点,广泛应用于支付、身份验证、营销推广等领域,Pythonqrcode库是... 目录一、安装 python qrcode 库二、基本使用方法1. 生成简单二维码2. 生成带 Log

C++中实现调试日志输出

《C++中实现调试日志输出》在C++编程中,调试日志对于定位问题和优化代码至关重要,本文将介绍几种常用的调试日志输出方法,并教你如何在日志中添加时间戳,希望对大家有所帮助... 目录1. 使用 #ifdef _DEBUG 宏2. 加入时间戳:精确到毫秒3.Windows 和 MFC 中的调试日志方法MFC

Python中的随机森林算法与实战

《Python中的随机森林算法与实战》本文详细介绍了随机森林算法,包括其原理、实现步骤、分类和回归案例,并讨论了其优点和缺点,通过面向对象编程实现了一个简单的随机森林模型,并应用于鸢尾花分类和波士顿房... 目录1、随机森林算法概述2、随机森林的原理3、实现步骤4、分类案例:使用随机森林预测鸢尾花品种4.1

Python使用Pandas库将Excel数据叠加生成新DataFrame的操作指南

《Python使用Pandas库将Excel数据叠加生成新DataFrame的操作指南》在日常数据处理工作中,我们经常需要将不同Excel文档中的数据整合到一个新的DataFrame中,以便进行进一步... 目录一、准备工作二、读取Excel文件三、数据叠加四、处理重复数据(可选)五、保存新DataFram

SpringBoot生成和操作PDF的代码详解

《SpringBoot生成和操作PDF的代码详解》本文主要介绍了在SpringBoot项目下,通过代码和操作步骤,详细的介绍了如何操作PDF,希望可以帮助到准备通过JAVA操作PDF的你,项目框架用的... 目录本文简介PDF文件简介代码实现PDF操作基于PDF模板生成,并下载完全基于代码生成,并保存合并P

深入理解C++ 空类大小

《深入理解C++空类大小》本文主要介绍了C++空类大小,规定空类大小为1字节,主要是为了保证对象的唯一性和可区分性,满足数组元素地址连续的要求,下面就来了解一下... 目录1. 保证对象的唯一性和可区分性2. 满足数组元素地址连续的要求3. 与C++的对象模型和内存管理机制相适配查看类对象内存在C++中,规

在 VSCode 中配置 C++ 开发环境的详细教程

《在VSCode中配置C++开发环境的详细教程》本文详细介绍了如何在VisualStudioCode(VSCode)中配置C++开发环境,包括安装必要的工具、配置编译器、设置调试环境等步骤,通... 目录如何在 VSCode 中配置 C++ 开发环境:详细教程1. 什么是 VSCode?2. 安装 VSCo

详解Java中如何使用JFreeChart生成甘特图

《详解Java中如何使用JFreeChart生成甘特图》甘特图是一种流行的项目管理工具,用于显示项目的进度和任务分配,在Java开发中,JFreeChart是一个强大的开源图表库,能够生成各种类型的图... 目录引言一、JFreeChart简介二、准备工作三、创建甘特图1. 定义数据集2. 创建甘特图3.

C++11的函数包装器std::function使用示例

《C++11的函数包装器std::function使用示例》C++11引入的std::function是最常用的函数包装器,它可以存储任何可调用对象并提供统一的调用接口,以下是关于函数包装器的详细讲解... 目录一、std::function 的基本用法1. 基本语法二、如何使用 std::function