c++中如何使用std::fill快速初始化数组_c++数组赋值技巧【汇总】
技术百科
穿越時空
发布时间:2026-01-15
浏览: 次 std::fill不能直接初始化内置数组,它仅填充已分配内存;正确用法是std::fill(std::begin(arr),std::end(arr), val),类型安全且免手动计算长度。
std::fill 能不能直接初始化内置数组
不能。std::fill 是填充已有内存区域的算法,不是初始化构造器——它要求目标内存已存在且可写。对未定义行为的未初始化数组(比如局部 int arr[10])调用 std::fill 是合法的,但严格来说,这不是“初始化”,而是“首次赋值”。真正需要初始化语义(如调用构造函数)的类类型数组,必须依赖 std::fill 配合默认构造对象,或改用 std::array/std::vector。
std::fill 填充原始数组的正确写法
关键在传入正确的迭代器范围:必须是 begin 和 end,不能只传指针或长度。常见错误是把数组名当首地址后手动加长度,容易越界或漏项。
int arr[5]; std::fill(std::begin(arr), std::end(arr), 42); // ✅ 推荐:类型安全,自动推导长度// 等价但不推荐的写法(易出错) std::fill(arr, arr + 5, 42); // ❌ 若 arr 长度变化,这里要同步改
-
std::begin(arr)和std::end(arr)在 C++11+ 中对原生数组可用,比手算arr + N更可靠 - 对动态分配数组(
new int[10]),必须自己记录长度,用std::fill(ptr, ptr + len, val) - 填充非 POD 类型(如
std::string数组)时,std::fill会调用赋值运算符,不是构造;若需重新构造,应考虑std::fill_n配合std::string{}或用循环
替代方案:什么时候不该用 std::fill
当目标是“定义即初始化”,而非“先定义再填值”时,std::fill 就是绕路。尤其在以下场景,直接初始化更清晰、更高效:
- 静态/全局数组:用
int arr[5] = {0};或{1,2,3}—— 零初始化由编译器完成,无运行时开销 -
栈上小数组:
std::arrayarr = {}; // 所有元素零初始化 - 需要默认构造的类数组:
std::array<:string> arr; // 自动调用每个 string 的默认构造 - 动态大小需求:直接用
std::vector,一步到位,避免裸指针管理(n, value)
std::fill_n 和 fill 的性能差异
两者底层几乎无差别,都是顺序写内存。区别仅在接口: std::fill 需迭代器对,std::fill_n 接收起始迭代器和数量。对原生数组,std::fill_n 更适合“填前 N 个”的场景,比如部分填充或与 malloc 配合:
int* ptr = static_cast(std::malloc(100 * sizeof(int))); if (ptr) { std::fill_n(ptr, 50, -1); // 只填前 50 个,无需计算 end }
但注意:std::fill_n 不检查边界,传错 n 会导致越界写——这点比 std::fill + std::end 更危险。
实际项目里,多数时候该优先用 std::array 或 std::vector 的构造函数初始化,而不是事后调用 std::fill。只有在数组已存在、且必须复用内存(比如缓存池、帧缓冲区)时,std::fill 才是合理选择。
# 才是
# 都是
# 但不
# 已有
# 首次
# 而非
# 迭代
# 什么时候
# 循环
# 对象
# c++
# String
# int
# 区别
# 指针
# 构造函数
# 接口
# 栈
# 算法
# len
# 运算符
# 中对
# 这不是
# Array
# c++数组
# 赋值运算符
相关栏目:
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
AI推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
SEO优化<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
技术百科<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
谷歌推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
百度推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
网络营销<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
案例网站<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
精选文章<?muma echo $count; ?>
】
相关推荐
- Win10如何卸载预装Edge扩展_Win10卸载
- c++怎么实现大文件的分块读写_c++ 文件指针s
- Win11如何设置系统声音_Win11系统声音调整
- Win11怎么连接投影仪_Win11多显示器投屏设
- Python变量绑定机制_引用模型解析【教程】
- Python对象比较与排序_魔术方法解析【教程】
- Windows如何查看和管理已安装的字体?(字体文
- mac怎么退出id_MAC退出iCloud账号与A
- Win11怎么设置鼠标宏_Win11鼠标按键自定义
- VSC怎样用终端运行PHP_命令行执行脚本的步骤【
- Windows10蓝屏SYSTEM_SERVICE
- c++ reinterpret_cast怎么用 c
- c# F# 的 MailboxProcessor
- Win11怎么清理C盘系统错误报告_Win11清理
- 如何在 VS Code 中正确配置并使用 NumP
- PHP 中如何在函数内持久修改引用变量所指向的目标
- MAC如何隐藏文件夹及文件_MAC终端命令隐藏与第
- Win11怎样安装微信开发者工具_Win11安装开
- c++中如何使用std::variant_c++1
- Windows 10怎么录屏_Windows 10
- Python安全爬虫设计_IP代理池与验证码识别策
- Win11怎么开启剪贴板历史记录_Windows1
- 如何从 Go 的 map[string]inter
- 如何在Golang中处理二进制数据_Golang
- Python技术债务管理_长期维护解析【教程】
- Windows如何拦截腾讯视频广告_Windows
- Win11局域网共享怎么设置 Win11文件夹网络
- c++怎么使用std::filesystem遍历文
- 新手学PHP架构总混淆概念咋办_重点梳理【教程】
- Win11怎么设置虚拟内存最佳大小_Windows
- Windows怎样关闭桌面弹窗广告_Windows
- Python实现图数据库操作_Neo4j核心CRU
- Win11怎么关闭OneDrive同步_Win11
- PHP的FastAdmin架构适合二次开发吗_特点
- Python文件操作优化_大文件与流处理解析【教程
- PyTorch DDP 多进程训练在 Kaggle
- 如何在Golang中捕获HTTP服务器错误_Gol
- Windows11如何设置专注助手_Windows
- 如何在Golang中解压文件_Golang com
- C++如何编写函数模板?(泛型编程入门)
- 如何在Golang中实现CI/CD流水线自动化测试
- VSC怎么创建PHP项目_从零开始搭建项目的步骤【
- php控制舵机角度怎么调_php发送pwm信号控制
- php485读数据时阻塞怎么办_php485非阻塞
- 如何使用Golang指针与接口结合_实现方法调用和
- Win11怎么恢复误删照片_Win11数据恢复工具
- Windows家庭版如何开启组策略(gpedit.
- 如何在 ACF 中正确更新嵌套多层 Group 字
- Windows电脑如何进入安全模式?(多种按键方法
- 如何在Golang中修改数组元素_通过指针实现原地


QQ客服