You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将连续整数范围插入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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 03:54:17