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

Ubuntu技巧-Ubuntu远程访问之SSH反向代理

💡大家好,我是可夫小子,《小白玩转ChatGPT》专栏作者,关注AIGC、互联网和自媒体。要把内网的一台的Ubuntu服务器让外面也能访问,总共有三种可行的方案,前面已经介绍了两种方式,今天就来介绍更健壮稳定的方式——ssh反向代理。大概的框架图如下,今天就从服务器购买到设置,手把手的教程,让你花费100块以内,就拥有一个强大的「云服务器」。

可夫小子的频道 1151

算法训练—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

【实战案例】IBM V3500存储控制器故障诊断与更换全流程解析

本文详细解析了IBM Storwize V3500存储控制器发生故障后的完整处理流程。通过还原真实故障现场,介绍了如何利用服务助手精准定位缓存模块损坏的根源,并逐步指导完成控制器备件准备、核心部件移植更换、系统上线同步及全面功能验证的全过程,为存储运维人员提供了一份实用的实战指南。

weixin_29269441的博客 547

局部,全局(外部),static等变量详解

首先,必须明白一个程序是包含若干个源文件,每个源文件又是包含若干个函数,每个源文件、函数中又定义了若干个变量。但是每个变量都有自己的作用范围,也就是自己的作用域。只有在作用域内才可以访问变量。 变量的有效范围称为变量的作用域( scope)。归纳起来,变量有4种不同的作用域:文件作用域( file scope)、函数作用域( function scope)、块作用域(block sc...

归根结底不优秀的博客 1322

用 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

CyberChef本地搭建

CyberChef本地搭建

2301_80241182的博客 6071

memset の 那些事儿 (C++)

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

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

vscode使用continue插件连接LM studio的模型

本文详细介绍了如何使用VSCode的Continue插件连接LM Studio模型。主要步骤包括:在LM Studio中加载模型并设置相关参数,启动API服务,修改Continue配置文件以集成LM Studio模型,并进行测试以验证连接是否成功。通过这些步骤,用户可以将LM Studio中的预训练模型与VSCode的Continue插件无缝对接,实现高效的自然语言处理和编程辅助功能。

weixin_43590837的博客 8628

com.sap.aii.af.service.cpa.CPAObjectNotFoundException: Couldn‘t retrieve inbound binding

错误消息:错误截图:该错误通常表示在集成配置中,未找到与特定消息匹配的入站绑定(Inbound Binding)。具体而言,错误消息中的 P/S/A(Party/Service/Action)值未在配置中找到对应的入站绑定。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 373

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万+

Error: Flash Download failed - Target DLL has been cancelled

由于换了新电脑,keil重装了下,然而之前的MCU的支持包没有安装,以及一些其他的问题,导致可以编译但是不能将程序烧录到单片机中。现整理一下解决思路: 1、将支持包下载并添加: 找到你需要用的MCU的具体型号: 例如: 点击网址,下载安装包,或者在csdn等其他网址下载安装包,将下载好的pack包放到keil5的安装目录下的.Download中: 点击file中的import,将路径选择到.........

hanhan的博客 5万+

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

Android AVB 分析(十三)dm-verity 设备是如何映射的?

在上一篇《Android AVB 分析(十二)嵌入式设备安全中的 dm-verity 简介》介绍 dm-verity 原理的时候,作者提供了一个 dm-verity 演示的例子。本篇我们基于 AOSP 源码 `android-13.0.0_r41` 实际编译生成的 Google Pixel 7 (“panther”) 设备的 system 分区镜像进行 dm-verity 设备验证实战。

洛奇看世界 2438

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

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

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

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

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

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、付费专栏及课程。

余额充值