std::fill填充数组需传迭代器,数组名作形参时退化为指针导致长度丢失,应优先用std::begin/std::end;vector须用begin()/end(),禁用&v[0]或data()于空容器;fill_n适用于已知数量的原始内存填充。

std::fill 填充普通数组时必须传入指针,不是数组名
直接传数组名会编译失败,因为数组名退化为指针后类型不匹配 std::fill 的迭代器要求。常见错误是写成 std::fill(arr, arr + 5, 42) 看似对,但若 arr 是函数参数(如 int arr[5]),实际传入的是 int*,无法推导长度,容易越界。
- 正确做法:对栈上数组,用
&arr[0]或arr(仅当arr是定义在当前作用域的原生数组)+std::size(arr)(C++17 起) - 更安全的写法:
std::fill(std::begin(arr), std::end(arr), 42),自动适配数组大小,且类型检查更严格 - 如果数组是全局或局部定义(非形参),
sizeof(arr)/sizeof(arr[0])仍可用,但易出错,不推荐
std::fill 填充 std::vector 时传 begin()/end() 迭代器
std::fill 对 std::vector 没有特殊处理,它只认迭代器 —— 所以必须用 v.begin() 和 v.end(),不能传 &v[0](除非 v 非空)或 v.data()(需手动算尾指针)。
- 空
vector调用v.begin() == v.end(),std::fill安全无副作用 -
v.data()只在v.size() > 0时有效;用&v[0]会触发未定义行为(UB)当v.empty() - 示例:
std::fill(v.begin(), v.end(), -1)是标准、安全、可读性高的写法
std::fill 和 std::fill_n 的选择取决于你有没有现成的起始迭代器
std::fill 接收首尾迭代器,std::fill_n 接收起点和元素个数。两者性能一致,选哪个看上下文。
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
- 已知范围(比如一个容器):优先用
std::fill(container.begin(), container.end(), val) - 只知道起点和数量(如填充某块 malloc 分配的内存):用
std::fill_n(ptr, n, val),避免手动算终点 - 误用风险:
std::fill_n(ptr, n, val)中n超出实际内存大小不会被检测,比std::fill更容易导致越界
std::fill 不支持初始化列表或结构体成员的递归填充
std::fill 是逐字节复制(对 POD 类型)或逐元素调用赋值操作符(对类类型),它不会“构造”新对象,也不会深入结构体字段。
立即学习“C++免费学习笔记(深入)”;
- 对
std::array<std::string, 3>填充""是合法的,调用每个std::string的赋值运算符 - 对含 const 成员或引用成员的结构体,
std::fill编译失败 —— 因为无法赋值 - 对
int[2][3]这样的二维数组,std::fill只能填最内层一维(如std::fill(arr[0], arr[0] + 3, 9)),不能一键填满整个二维布局
std::fill 的边界条件。写之前多看一眼迭代器是否有效,比事后调试快得多。

















