如何高效运用_fill与iota技巧批量初始化数组?
- 内容介绍
- 文章标签
- 相关推荐
本文共计1224个文字,预计阅读时间需要5分钟。
codestd::fill 是最直接的全设置为某值的方案,但它不检查容器是否为空,也不验证迭代器是否合法——错误。begin 和 end 会直接导致未定义行为——错误。
- 对
std::vector:确保用v.begin()和v.end(),别手抖写成v.begin() + 1或漏掉+ v.size() - 对原生数组:必须显式计算地址边界,
int arr[10]; std::fill(arr, arr + 10, 42);—— 写成arr + 11就越界了 - 对
std::array:推荐用a.begin()/a.end(),比&a[0]更安全,尤其在模板上下文中 - 性能上,
std::fill通常被编译器优化为memset(仅限 trivial 类型且值为 0),但非零值或自定义类型仍走循环赋值
用 std::iota 填递增序列,注意起始值和类型匹配
std::iota 生成等差为 1 的整数序列,但它不关心目标容器元素类型能否隐式转换——若起始值是 int 而容器是 unsigned char,溢出后行为由实现定义,不是截断就是未定义。
本文共计1224个文字,预计阅读时间需要5分钟。
codestd::fill 是最直接的全设置为某值的方案,但它不检查容器是否为空,也不验证迭代器是否合法——错误。begin 和 end 会直接导致未定义行为——错误。
- 对
std::vector:确保用v.begin()和v.end(),别手抖写成v.begin() + 1或漏掉+ v.size() - 对原生数组:必须显式计算地址边界,
int arr[10]; std::fill(arr, arr + 10, 42);—— 写成arr + 11就越界了 - 对
std::array:推荐用a.begin()/a.end(),比&a[0]更安全,尤其在模板上下文中 - 性能上,
std::fill通常被编译器优化为memset(仅限 trivial 类型且值为 0),但非零值或自定义类型仍走循环赋值
用 std::iota 填递增序列,注意起始值和类型匹配
std::iota 生成等差为 1 的整数序列,但它不关心目标容器元素类型能否隐式转换——若起始值是 int 而容器是 unsigned char,溢出后行为由实现定义,不是截断就是未定义。

