如何将连续整数范围插入std::vector?C++17优雅实现方案问询
优雅生成连续整数的std::vector(C++17方案)
当然有更简洁的实现方式!C++17本身确实没有原生支持像vector<int> result{23 .. 57};这样的“范围初始化”语法糖,但我们可以用几种技巧大幅简化代码,甚至接近你想要的单行风格。
方案1:利用标准库的std::iota
std::iota来自<numeric>头文件,它能给容器元素赋予连续递增的值。结合vector的构造函数指定大小,我们可以写成两行(甚至合并为单行):
#include <vector> #include <numeric> // 可读性优先的两行写法 std::vector<int> result(57 - 23 + 1); std::iota(result.begin(), result.end(), 23); // 合并为单行(简洁但可读性稍降) std::vector<int> result(57-23+1); std::iota(result.begin(), result.end(), 23);
这个方案完全依赖标准库,不需要额外代码,比原循环写法简洁很多。
方案2:自定义range辅助函数(最接近你的理想写法)
如果想要更接近vector<int> result{23..57}的直观风格,我们可以写一个极简的模板函数,一次定义后就能反复使用:
#include <vector> template<typename T> std::vector<T> range(T start, T end) { std::vector<T> vec; vec.reserve(end - start + 1); // 预分配内存,保证效率 for (T i = start; i <= end; ++i) { vec.push_back(i); } return vec; } // 调用时就是完美的单行! std::vector<int> result = range(23, 57);
这个函数支持所有整数类型(int、long等),效率和原循环写法一致,可读性却提升了不少。
额外补充:C++20的极致写法
虽然你问的是C17,但可以提一句:C20引入的范围库(Ranges)能实现更极致的简洁,用std::views::iota生成连续整数视图,再转换为vector:
#include <vector> #include <ranges> // 注意:iota的第二个参数是开区间,所以要写58而非57 std::vector<int> result = std::views::iota(23, 58) | std::ranges::to<std::vector>();
内容的提问来源于stack exchange,提问作者Narek
相关产品推荐
相关产品推荐

