fill和memset函数详细说!(以及其中的inf=0x3f3f3f3f给int型赋值)【c++】

C++ std::fill算法详解:从原理到实战,告别手写循环 在C++标准模板库(STL)中,算法是提升代码质量和开发效率的核心组件。其设计哲学强调算法与容器的解耦,通过迭代器这一通用接口进行协作,实现了高度的复用性和灵活性。这种泛型编程范式不仅减少了样板代码,还能让编译器进行深度优化,从而提升程序性能。在众多基础算法中,批量赋值操作是数据处理中的高频需求,广泛应用于数组初始化、状态重置、缓冲区清空等场景。std::fill算法正是为此而生,它通过迭代器范围接收一个指定值,并高效地覆盖目标区间内的所有元素。该算法的时间复杂度为线性,空间复杂度为常数,是现代C++工程实 阅读详情

fill函数:

  • 在头文件< algorithm >中
  • 按照单元赋值,即将一个区间中的元素都赋同一个值
fill(arr, arr + n, 要填入的内容);   //普通数组
fill(v.begin(), v.end(), -1);       //vector
fill(f[0], f[0]+N*N, 要填入的内容);    //二维数组

fill应该是不可以给三维数组赋初值的(测试了一下),你们也可以尝试一下。(在之前写代码的时候想用,发现用不了)

memset函数:

  • 在头文件< cstring >中
  • 按照字节填充某字符

因为memset函数按照字节填充,所以一般memset只能用来填充char型数组,(因为只有char型占一个字节)如果填充int型数组,除了0和-1,其他的不能。因为只有00000000 = 0,-1同理,如果我们把每一位都填充“1”,会导致变成填充入“11111111”。

理论上只能初始化为0和-1,但是!

	memset()函数还能将int型数组初始化为INF(0x3f3f3f3f)

以下内容参考自:https://blog.youkuaiyun.com/Karen_Yu_/article/details/78660591

首先来说说 inf=0x3f3f3f3f:

0x3f3f3f3f的十进制是1061109567,也就是10^9级别的(和0x7fffffff(32-bit int的最大值)一个数量级),而一般场合下的数据都是小于10^9的,所以它可以作为无穷大使用而不致出现数据大于无穷大的情形。

另一方面,由于一般的数据都不会大于10^9,所以当我们把无穷大加上一个数据时,它并不会溢出(这就满足了“无穷大加一个有穷的数依然是无穷大”),事实上0x3f3f3f3f+0x3f3f3f3f=2122219134,这非常大但却没有超过32-bit int的表示范围,所以0x3f3f3f3f还满足了我们“无穷大加无穷大还是无穷大”的需求。


最大好处:
如果我们想要将某个数组清零,我们通常会使用memset(a,0,sizeof(a)),但是当我们想将某个数组全部赋值为无穷大时(例如解决图论问题时邻接矩阵的初始化),就不能使用memset函数了,因为memset是按字节操作的,它能够对数组清零是因为0的每个字节都是0,现在好了,如果我们将无穷大设为0x3f3f3f3f,那么奇迹就发生了,0x3f3f3f3f的每个字节都是0x3f!

所以要把一段整型数组全部置为无穷大,我们只需要 memset(a,INF,sizeof(a))。


编程中无穷大的设定:(主要介绍优点)
很多人可能设为0x7fffffff,这个数的确是32-bit int的最大值,符号位为0,其他的都是1

但在很多情况下,0x7fffffff会出现错误,比如溢出,这样两个无穷大数相加会变成负数,还有如在做dijkstra求最短路时,当做松弛操作,判断if (d[u]+w[u][v]<d[v]) d[v]=d[u]+w[u][v]时,若u到v没有路劲,w[u][v]=0x7fffffff,这样d[u]+w[u][v]会变成负数,这就产生了错误。

为了尽量避免以上的错误,我们可以改变无穷大的设定,可以将0x3f3f3f3f设为无穷大,0x3f3f3f3f的10进制表示为1061109567,这个数已达到10^9,足以表示无穷大,又0x3f3f3f3f+0x3f3f3f3f=2122219134,满足无穷大+无穷大仍为无穷大

当把无穷大设为0x3f3f3f3f时,在做初始化时也很方便,比如在初始化数组a时,可以使用

Memset(a,0x3f,sizeof(a)),因为0x3f3f3f3f的每个字节都是0x3f,如果使用0x7fffffff,需要循环赋值,耗费更多时间。

#include <cstring>
#define inf 0x3f3f3f3f
//#define memset(a,b) memset(a,b,sizeof(a))
using namespace std;
int main(){
    int a[20];
    memset(a,inf,sizeof(a)); 
    memset(a,0x3f,sizeof(a));
    return 0;
}

以上两种方式都一样(亲测有效)。

蓝桥杯算法提高组:网格DP路径计数与状态转移实战 动态规划是解决多阶段决策优化问题的核心算法,其本质是将复杂问题分解为重叠子问题,通过状态定义与转移方程逐步求解最优值或方案数。在二维网格场景中,动态规划常用于路径计数、最小代价等经典问题,技术价值在于以O(n*m)的时间复杂度高效处理大规模状态空间。这类方法广泛应用于算法竞赛、路径规划与资源调度等场景。以蓝桥杯算法提高组题目为例,常以故事化背景包装网格DP考点,需将文字描述准确翻译为状态转移方程,并处理好边界初始化与障碍物判断。掌握C++示例代码中的数组维度选择、哨兵技巧与调试方法,是提升竞赛通过率的关键。 阅读详情

相关推荐

蓝桥杯国赛C++ B组真题解析:算法与工程能力的综合挑战

在算法竞赛和工程实践中,数据结构与算法是解决复杂问题的核心基础。理解搜索(如BFS/DFS)、动态规划等经典算法的原理,能够帮助开发者高效处理状态空间和最优解问题,这在路径规划、游戏AI等场景中具有重要价值。通过掌握C++ STL容器(如vector、map)和算法库,可以提升代码实现效率和健壮性。本文以蓝桥杯国赛真题为例,深入剖析了状态扩展BFS和模拟实现等关键技术,展示了如何将算法思维与工程实践结合,解决类似迷宫寻路、条件约束等综合性问题。

weixin_34342992的博客 357

C/C++,用0x3f3f3f3f表示无穷大

https://blog.youkuaiyun.com/u011361880/article/details/77511559?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-3.nonecase&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-3.nonecase 如果

zou_albert的博客 3042

如何读懂CiteSpace图谱?科研小白必看的节点颜色/年轮/聚类解读手册

本文详细解析CiteSpace图谱的核心视觉元素,包括节点颜色、年轮和聚类标识,帮助科研人员准确解读数据分析结果。通过生物医学案例展示如何从图谱中识别关键文献和研究趋势,提供五步系统解读法和常见错误规避策略,助力科研小白快速掌握文献计量分析技巧。

weixin_29179311的博客 314

算法训练—leetcode—数组篇(一)

1.反转字符串 编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 char[] 的形式给出。 不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。 你可以假设数组中的所有字符都是 ASCII 码表中的可打印字符。 示例 1: 输入:[“h”,“e”,“l”,“l”,“o”] 输出:[“o”,“l”,“l”,“e”,“h”] 示例 2: 输入:[“H”,“a”,“n”,“n”,“a”,“h”] 输出:[“h”,“a”,“n”,“n”,“a”,“H”

歪桃的博客 7245

多目标进化算法——NSGA-II(python实现)

NSGA-II(python实现)--最全注释,痴呆能懂--

no___good的博客 5279

软考软件评测师备考避坑指南:过来人告诉你这5个章节最容易丢分(附2024最新考纲解析)

本文为软考软件评测师考生提供备考避坑指南,深度解析5个高频失分章节,包括标准化与信息化基础、中间件技术、软件测试模型、白盒测试覆盖准则和性能测试指标。文章结合2024最新考纲,分享实战技巧和记忆口诀,帮助考生精准打击失分重灾区,提升备考效率。

weixin_29223603的博客 467

用 0x3f3f3f3f 设定最大int值的优点

在许多算法中都要用到一个常量来表示最大值,例如:寻找一个最小数,就要先设定一个值a,如果比a小,a就等于这个数;再如,最短路径中基本的松弛操作: 1 if (d[u]+w[u][v]&lt;d[v]) d[v]=d[u]+w[u][v]; 计算机不会表示出“无穷大”的概念,所以我们只能以一个定值来表示“最大”。那么使用什么值呢? 对于int类型,很自然地,我们想到用 0x7f ff ff ff 。...

予歌的博客 885

S32K3的STCU2模块详解:从硬件FSM到MCAL配置,搞懂BIST在线测试全流程

本文深入解析S32K3系列MCU的STCU2模块,从硬件FSM架构到MCAL配置,详细讲解BIST在线测试全流程。通过分区的安全策略和实战代码示例,帮助开发者掌握汽车电子系统中的功能安全实现,提升系统可靠性和安全性。

weixin_42525328的博客 446

memset の 那些事儿 (C++)

首先,memset 可以初始化数组memset(数组名, 初始化的值, sizeof 数组名);头文件(不加 有可能 不会报错,但考试的时候 会寄这里有一张图,包括了我讲的所有操作:制作不易,留个赞再走吧声明:这里如果memsetdouble类型的数组,有精度问题,可能会出现答案错误真正的考试中一般都得手动初始化。

这个人是一个c++修狗 430

【Pix4d精品教程】pix4d mapper相机未校准后手动添加连接点完美案例图文教程

如图所示,红色的照片为未校准的图片,软件无法自动获取连接点,有关相机未校准的原因及解决办法,可以参考《pix4d未校准相机:287 out of 402 images calibrated (71%), all images enabled, 6 block,问题分析及解决方案汇总》,本文以案例的形式,详细讲解pix4d中手动添加连接点的方法及操作步骤。 文章目录1. 手动添加连接点2. 重新优化3. 生成质量报告,检查精度 1. 手动添加连接点 在【空三射线】模式下查看校准失败的图片,记下照片的名称。.

智慧空间实验室 2万+

uniapp [安卓苹果App端] - 详细实现下载文件保存到用户手机本地,指定文件存储位置路径及文件夹名称下载并保存,Uniapp app端将文件下载保存并储存到指定目录(手机系统存储空间权限检测)

uni-app,安卓Android,苹果ios,安卓app端,苹果App端,uniapp苹果安卓app,app端下载文件,移动端文件下载,并保存到手机本地存储空间,uniapp下载文件保存到手机本地,iOS下载文件怎么保存,系统读写存储空间权限,下载文件到本地详细流程及源代码,保存自定义目录,uniapp,实现下载文件并保存到本地,文件后缀,如何指定手机的存放目录路径url,点击下载文档到手机中并提示存储位置,如何在uniapp中实现文件下载功能,uniApp文件下载,怎么指定文件保存目录,下载报错,没反应

🏆 前端领域优质创作者 1万+

C++ 获取数组长度

C++ 获取数组长度 1 字符串数组 对于字符串数组,使用strlen()函数来获取字符串数组的长度。 char a1[] = "fwegweasdasdwqew"; cout << strlen(a1) << endl; 2 数字数组 例如: int arr[] = { 1,5,9,10,9,2 }; 可以用sizeof(a)/sizeof(a[0])来获取数组的长度。 原理:sizeof()函数可以返回数组所占的内存,而sizeof(a[0])返回的是数组第一个元素所占的内

zou_albert的博客 13万+

Anomalib库安装以及使用

Anomalib是一个专注于异常检测的深度学习库。它的目标是收集最新的异常检测算法,并提供用于在公共和私有数据集上进行基准测试的工具。该库提供了一系列已实现的异常检测算法,这些算法在最近的文献中有所描述。此外,Anomalib还提供了一套工具,方便开发人员开发和实现自定义模型。该库特别注重基于图像的异常检测,旨在识别数据集中的异常图像或图像中的异常像素区域。通过使用Anomalib,用户可以快速构建和评估各种异常检测算法,以满足其特定需求。

mingo_敏 5197

fill和memset的区别

fill函数的作用是:按照单元赋值,将一个区间的元素都赋予val值。函数参数:fill(vec.begin(), vec.end(), val); val为将要替换的值。 #include &lt;algorithm&gt; fill(vec.begin(), vec.end(), val); //原来容器中每个元素被重置为val memset函数的作用是:按照字节填充某字符 #inc...

Nicolas的博客 4002

自然语言处理:长文本场景下的关键词抽取实践

自然语言处理:长文本场景下的关键词抽取实践

丨汀、的博客 2076

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

fill和memset函数(C++)

memset函数 头文件 #include<string.h> 因为memset函数按照字节填充,所以一般memset只能用来填充char型数组,(因为只有char型占一个字节)如果填充int型数组,除了0和-1,其他的不能。因为只有00000000 = 0,-1同理,如果我们把每一位都填充“1”,会导致变成填充入“11111111”。 理论上只能初始化为0和-1,而且必须为数组,但是memset()函数还能将int型数组初始化为INF(0x3f3f3f3f)——最大值 具体介绍https://

lzh的博客 1081

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

memset和fill

memset memset是计算机中C/C++语言初始化函数。作用是将某一块内存中的内容全部设置为指定的值, 这个函数通常为新申请的内存做初始化工作。 头文件 在C中 &lt;string.h&gt; 在C++中 &lt;cstring&gt; 使用方法 void *memset(void *s, int ch, size_t n); 函数解释:将s中当前位置后面的n个字节 用 ch...

1900的博客 1186

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

C++ fill()与memset()的区别

memset() memset是对按照字节来填充的,所以一般用来填充char型数组。 也经常用于填充 int 型的全0或全-1操作,也可以用于填充 INF = 0x3f3f3f3f 例: const int INF = 0x3f3f3f3f; int a[100]; …… …… memset(a, 0, sizeof(a)); memset(a, INF, sizeof(a)); …… …… f...

Authur_gyc 382

C++ 中 fill()、fill_n() 与 memset() 函数的区别

C++ 中 fill()、fill_n() 与 memset() 函数的区别对比 memset 赋值为 0x3f3f3f3f 是因为 int 数据类型是四个字节,memset 按字节赋值,memset(a, 0x3f, sizeof(a)) 意思就是把a数组中所有字节都赋值为 0x3f,0x3f 是正值,所以补码和原码一样,这样对 a 中的任意一个数据 a[i],就都变成了 0x3f3f3f3f。(计算机中存储所有数据都是补码,正数的补码是其二进制本身,负数是除符号位取反加 1 所以 -1 的补码是全 1)

LucienShui 7556

如果数组开的是Long long 的话,不能用memset赋值,应该用fill函数

#include <bits/stdc++.h> using namespace std; #define int long long const int N=2*10000+50; int dis[N]; int ans[N]; bool vis[N]; int n,p,c; int cnt[N]; int h[N],ne[N],target[N],w[N]; int idx=1; const int fill_val=0x3f; const int INF=0x3f3f3f3f...

Restart_0813的博客 1214

C++ 常用函数与容器速查手册

知识点总结一下

xxwl585的博客 247

LeetCode 174 地下城游戏(Dungeon Game):从终点倒推的逆向动态规划题解

> 本文基于 doocs/leetcode 仓库中 [0174.Dungeon Game 题解文档](https://link.gitcode.com/i/fe949f0a03c191408c580f857571be05) 展开,完整解析 LeetCode 174「地下城游戏」这一经典 Hard 动态规划问题:包括题目背景、示例与约束、为何正向 DP 不可行、逆向 DP 的状态设计与转移方程推导,

gitblog_01406的博客 905

分层图建模与0-1BFS:解决多约束最短路问题

在图论算法中,当最短路径问题引入携带数量、能量槽位、模式状态等离散约束维度时,传统二维图模型将失效——因为同一坐标点的不同约束组合代表完全不同的可达性。此时需采用分层图建模思想,将隐含约束显式升维为图的‘楼层’,使状态空间变为三维(x, y, k),从而保证状态唯一性与搜索完备性;在此基础上,若边权仅含0和1两类(如拾取不耗能、移动耗1),则0-1BFS配合双端队列可替代Dijkstra,实现O(V+E)线性时间复杂度,兼顾正确性与工程效率。该方法广泛适用于带资源管理的网格寻路、嵌入式任务调度及状态机最短转

weixin_34161029的博客 399

LCP 19. 秋叶收藏集:三状态动态规划求最小调整次数(doocs/leetcode 题解精讲)

本篇以 doocs/leetcode 开源仓库中 [LCP 19. 秋叶收藏集](https://link.gitcode.com/i/860b7fe7aa2ec4d59ee06888dcb0d8c2) 的官方题解为骨架,完整拆解这道中等难度的字符串动态规划题:如何把仅含 `r`(红叶)与 `y`(黄叶)的收藏集调整成「红 + 黄 + 红」三段的优美形态,并求出最少的单点颜色翻转次数。读完本文,你

gitblog_00826的博客 213

3 行代码搞定测试数据:Faker 模拟数据生成上手指南

别再手写测试数据了。Faker 能在几秒内批量生成模拟数据,从姓名到邮箱一应俱全,本文带你从零跑通整个流程。 ## 为什么测试数据总要手动凑 跑一遍接口测试,光造数据就耗掉半小时。你往数据库里塞假订单,姓名得现编、手机号得凑够 11 位、邮箱还得带域名——写完一组发现下一组又得换个花样,重复劳动还容易漏字段。更糟的是,下次换台机器重跑,那批数据格式可能就不合规了。 Faker 把这套流程压缩

gitblog_01042的博客 308
上一篇: max_element函数和min_element函数【c++】
下一篇: HTML,CSS ,Javascript的简单介绍
Sun990o
博客等级 码龄9年 86粉丝 193原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值