C++如何原地生成带连续序列的std::vector 无需临时对象与额外调用
连续序列容器生成的精简实现方案
你想要的原地生成、无需额外临时对象、可直接用于成员初始化列表的实现,分不同C++版本有以下可选方案:
C++20及以上最简写法(无需额外定义函数)
直接用标准范围库的iota视图配合to适配器,一行代码即可完成构造,可直接嵌入初始化列表:// 示例:构造存储0~9的std::vector<int> std::vector<int> seq = std::views::iota(0, 10) | std::ranges::to<std::vector<int>>();该方案无任何冗余操作,底层直接在目标容器的内存空间生成序列,完全符合原地构造的要求。如果需要生成
std::initializer_list,可以配合constexpr函数在编译期生成固定长度的短序列。C11~C17可选写法
- 就地lambda实现(无需额外定义全局函数)
直接在初始化列表中嵌入匿名lambda完成构造,不需要单独维护生成函数:// 成员初始化列表中使用示例,cnt为序列长度 : m_seq([cnt] { std::vector<int> res(cnt); std::iota(res.begin(), res.end(), 0); return res; }()) - 原有实现的优化说明
你当前的写法已经没有多余开销:主流编译器默认开启的**命名返回值优化(NRVO)**是C++标准要求的优化项,返回的vector不会发生额外拷贝,本质就是直接在调用方的目标内存地址上构造序列,和你要求的原地生成效果完全一致,不需要额外修改。
- 就地lambda实现(无需额外定义全局函数)
内容的提问来源于stack exchange,提问作者Ferenc Deak
相关产品推荐
相关产品推荐

