如何在标准C++中初始化static inline std::vector为0到65534的连续序列
解决方案
方案1:C++20及以上标准(最简洁,完全匹配需求)
直接用std::views::iota配合范围转容器接口,一行即可完成初始化,全程使用标准C++特性,无需任何编译器扩展或者额外初始化调用:
#include <vector> #include <ranges> #include <cstdint> #include <limits> class YourClass { public: static inline const std::vector<uint16_t> seq = std::views::iota(0u, std::numeric_limits<uint16_t>::max()) | std::ranges::to<std::vector>(); };
std::views::iota生成的序列默认不包含终止值,所以直接填入std::numeric_limits<uint16_t>::max()就刚好生成0到max()-1的全部整数,完全符合需求。
方案2:兼容C11~C17的标准实现
如果编译环境不支持C20,可以使用立即调用Lambda表达式(IIFE)完成初始化,C11及以上版本均支持该写法:
#include <vector> #include <cstdint> #include <limits> #include <numeric> class YourClass { public: static inline const std::vector<uint16_t> seq = [](){ std::vector<uint16_t> tmp(std::numeric_limits<uint16_t>::max()); std::iota(tmp.begin(), tmp.end(), 0u); return tmp; }(); };
- 该方案在程序启动阶段自动执行Lambda完成容器填充,不需要用户额外调用任何初始化函数,全程符合标准C++规范。
- 如果编译器不支持
static inline类成员(该特性为C++17引入),只需要去掉inline关键字,在类外单独定义该静态成员即可,填充逻辑完全不变。
内容的提问来源于stack exchange,提问作者selamba
相关产品推荐
相关产品推荐

