std::fill用于填充相同值,std::iota仅适用于严格+1递增整数序列;二者语义不同,选错导致编译失败或未定义行为,性能差异次要于正确性与安全性。

std::fill 和 std::iota 不是性能二选一的问题,而是语义锁死的两个工具:填相同值就用 std::fill,填 0/1/2… 这类严格 +1 递增整数序列才轮到 std::iota;选错直接编译失败或行为错误,压测快慢毫无意义。
std::fill 传错迭代器范围会直接越界崩溃
它不做任何边界检查,只按你给的 [first, last) 范围逐个赋值。对 int arr[10],写成 std::fill(arr, arr + 11, 0) 就是未定义行为——最后一个写入落在栈上未知位置,调试器未必报错,但可能踩坏相邻变量或返回地址。
- 原生数组优先用
std::fill(std::begin(arr), std::end(arr), 0),C++11 起支持,大小变化时不用改数字 - 手动算指针时,
arr + N的N必须是元素个数,不是字节数;在函数参数里传int arr[]后用sizeof(arr)会退化为指针,结果恒为 8(64 位) -
std::vector空时调用std::fill(v.begin(), v.end(), 42)安全但无效(begin() == end()),想扩容得先v.resize(n)或直接用v.assign(n, 42) -
std::array推荐用成员函数a.fill(0)(C++11),不依赖<algorithm></algorithm>,也更短
std::iota 只能填 +1 整数序列,浮点和自定义类基本废
它的行为是“第 0 个位置写 value,第 1 个写 ++value(前置递增),第 2 个再 ++value……”,所以根本不是“从 0 开始填索引”,而是“从你给的起始值开始,每次加 1”。类型必须支持 operator++,且起始值不能溢出。
-
std::vector<double></double>上用std::iota:第 100 万个元素理论应为start + 999999,但浮点累加误差可能让实际值偏差 >0.1,别用于精度敏感场景 -
unsigned char buf[5]从 254 开始:std::iota(buf, buf + 5, 254)→{254, 255, 0, 1, 2},这是标准规定的回绕,不是 bug,但若逻辑依赖“严格递增”就崩了 -
std::string arr[3]调用std::iota直接编译失败——std::string没有operator++ - 想填
{10, 20, 30}?std::iota做不到,得用std::generate配 lambda:[n = 0]() mutable { return (n += 10); }
性能差异其实很小,但优化路径天差地别
两者都是 O(n) 线性遍历,真实差距不在算法,而在编译器能否识别模式并替换为底层指令。小数组(10k)才看出分水岭。
立即学习“C++免费学习笔记(深入)”;
-
std::fill(ptr, ptr + n, 0)在 GCC/Clang -O2 下大概率被优化为memset,尤其对char、int对齐数组,速度接近内存带宽极限 -
std::fill(ptr, ptr + n, 42)对非零多字节值(如int(12345))通常不触发memset,但现代编译器常能向量化为 AVX store,未必比手写循环慢 -
std::iota几乎无法 SIMD 化——每个值依赖前一个,实测 10Mint数组上,它比std::fill(, 0)慢约 30%~50%,主因是 load-modify-store 链和加法延迟 - 真正影响初始化耗时的,往往是内存布局:局部大数组(如
int arr[100000])可能触发栈溢出;用alignas(64)对齐 cache line 对后续遍历有用,但对初始化本身影响微弱
真正该优先考虑的初始化方式,往往不是 fill 或 iota
它们只是运行时填充手段。编译期已知值,优先用声明时花括号初始化:int arr[1024] = {} 或 int arr[4] = {1,2,3,4}。这种写法零开销,编译器可生成最优机器码(如 .data 段置零或单指令清零),且不会因运行时逻辑出错而漏填。
最容易被忽略的关键点:所有这些函数(std::fill、std::iota、std::generate)都只负责**写入已分配空间**,不构造对象、不扩容、不检查内存是否有效。传入悬空指针、未初始化的 malloc 区域、或 std::vector<bool>::iterator</bool>,结果不是慢,而是崩溃或编译失败。



















