std::iota仅向已有内存写入连续整数,不扩容;需先resize()分配并构造元素,reserve()不足;起始值须兼容目标类型,避免截断或溢出;c++20 views::iota为只读视图,非原地填充。
std::iota 填充连续整数必须提供起始迭代器和结束迭代器
它不生成新容器,只往已有内存里写值——如果你传入空 vector 的 begin() 和 end(),什么都不会发生,也不会报错,只会默默跳过。
常见错误是误以为 std::iota 能自动扩容:
std::vector<int> v; std::iota(v.begin(), v.end(), 0); // ❌ 什么都没填,v 仍是空的
正确做法是先分配空间:
- 用
resize():保证元素可写,会调用默认构造(对 int 是 0) - 用
reserve()不够,它只分配内存但不构造对象,iota写入会触发未定义行为 - 如果已有数据且只想覆盖某段,确认迭代器范围合法,尤其注意
end()是「尾后」位置
iota 的起始值类型必须能隐式转换为目标元素类型
比如目标容器是 std::vector<unsigned long></unsigned>,你传 0 没问题;但传 -1 就可能触发警告或静默截断(取决于编译器和警告级别)。
立即学习“C++免费学习笔记(深入)”;
典型翻车场景: