std::fill适用于批量赋相同值,std::iota生成递增整数序列,花括号初始化实现编译期零初始化,memset仅限POD类型底层字节填充,std::generate配合lambda实现灵活序列填充。

一、使用 std::fill 批量赋相同值
当需要将数组所有元素设置为同一固定值(如 0、-1、42)时,std::fill 是语义最清晰、编译器优化最充分的方案。它不关心类型是否可构造,仅要求元素支持赋值操作,适用于原生数组、std::array 和 std::vector 等连续内存容器。
1、对 C 风格数组:调用 std::fill(arr, arr + N, value),其中 arr + N 必须是尾后指针,不可写作 arr + N - 1 或误用 sizeof(arr) 计算长度。
2、对 std::array
3、对 std::vector
4、确保头文件已包含 #include
二、使用 std::iota 生成递增整数序列
std::iota 专用于按位置顺序填充等差为 1 的递增序列,其行为是“首位置赋起始值,后续每个位置赋 ++value(前置递增)”,适用于索引数组、测试数据生成等场景,但不支持自定义步长、倒序或浮点精确序列。
1、对原生数组:调用 std::iota(arr, arr + N, start_value),例如 std::iota(arr, arr + 5, 10) 得到 {10, 11, 12, 13, 14}。
2、对 std::array 或 std::vector:使用 std::iota(a.begin(), a.end(), start_value) 或 std::iota(v.begin(), v.end(), start_value),确保容器已预分配足够空间(如通过构造或 resize),iota 不执行扩容。
3、起始值类型必须与元素类型兼容:对 unsigned char 数组传入 255 将导致溢出,应选用能无损覆盖整个序列范围的起始类型,例如 std::iota(v.begin(), v.end(), 0LL) 配合 std::vector
4、禁止用于 std::vector
三、使用声明时花括号初始化(编译期零初始化)
对于栈上或全局静态数组,若初始化值在编译期已知(如全零、首元素指定),直接在定义处使用 {} 初始化可完全避免运行时开销,生成代码常被优化进 .data 段或由单条指令完成清零,是性能与安全性最优的首选方式。
1、声明 int arr[1024] = {}; 即完成全零初始化,= {} 与 = {0} 效果一致,均触发零初始化语义。
2、若仅初始化首元素,如 int arr[5] = {42};,则 arr[0] 为 42,其余元素仍被零初始化,而非未定义值。
3、该方式仅适用于编译期确定大小的数组,不适用于运行时动态大小(如 int arr[n],n 非 constexpr),此时必须切换至 std::fill 或堆分配方案。
4、对 std::array
四、使用 memset 进行底层字节填充(限 POD 类型)
memset 是 C 风格的底层内存填充函数,仅适用于 trivial 类型(POD),且仅在填充值为 0 或 -1(即 0xFF)时能保证语义正确;它绕过构造与赋值逻辑,直接操作字节,速度快但极度危险,误用将破坏对象内部状态。
1、对 int 数组清零:调用 memset(arr, 0, sizeof(arr)) 安全有效,现代编译器常将 std::fill(arr, arr + N, 0) 优化为此等效指令。
2、禁止对非 POD 类型调用 memset:如 std::string、std::vector、含虚函数或非平凡构造函数的类对象数组,此举导致未定义行为(UB),可能引发崩溃或数据损坏。
3、禁止用 memset 填充非零多字节值:如 memset(arr, 1, sizeof(arr)) 对 int 数组填出的是 0x01010101(即 16843009),而非期望的 {1, 1, 1, …}。
4、使用前必须包含 #include
五、使用 std::generate 配合 lambda 实现灵活序列填充
当 std::fill 和 std::iota 均无法满足需求(如偶数序列、平方数、随机数、带偏移的等差数列),std::generate 提供完全可控的逐元素生成机制,通过 lambda 捕获状态并返回计算值,语义明确且泛型安全。
1、生成偶数序列 {0, 2, 4, 6, …}:调用 std::generate(arr, arr + N, [n = 0]() mutable { return n += 2; }),利用 mutable 允许修改捕获变量。
2、生成平方数 {0, 1, 4, 9, …}:使用 std::generate(arr, arr + N, [i = 0]() mutable { return i * i++; }),注意 i++ 与 ++i 的语义差异。
3、对 std::vector
4、需包含 #include
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











