压入从0到Nvector(C++)
压入从0到N到vector
- 方法一:简单循环 + push_back
- 方法二:构造时指定大小 + std::iota
- 方法三:使用算法 std::generate_n
- 方法四(C++20):Ranges + std::views::iota
- 选择建议
方法一:简单循环 + push_back
#include <vector>std::vector<int> v;
v.reserve(N + 1); // 预分配空间,避免多次 realloc
for (int i = 0; i <= N; ++i) {v.push_back(i);
}
-
核心思想:每次 push_back 一个新元素
-
优势:直观易懂
-
小贴士:事先 reserve(N+1) 可以避免动态扩容开销
方法二:构造时指定大小 + std::iota
#include <vector>
#include <numeric> // for std::iotastd::vector<int> v(N + 1);
std::iota(v.begin(), v.end(), 0);
-
核心思想:一次性分配好长度,再用 std::iota 填充从 0 开始的连续整数
-
优势:代码简洁,效率高
-
注意:需要 #include
方法三:使用算法 std::generate_n
#include <vector>
#include <algorithm>std::vector<int> v;
v.reserve(N + 1);
int x = 0;
std::generate_n(std::back_inserter(v), N + 1, [&x]() { return x++; });
-
核心思想:借助 STL 算法和迭代器适配器,一次性生成 N+1 个值
-
优势:风格较函数式,避免显式循环
方法四(C++20):Ranges + std::views::iota
#include <vector>
#include <ranges>auto rng = std::views::iota(0, N + 1);
std::vector<int> v{rng.begin(), rng.end()};
-
核心思想:利用 C++20 的范围视图,生成一个惰性 iota 序列,再拷贝到 vector
-
优势:最简洁、现代化,但需编译器支持 C++20
选择建议
-
如果你只需要简单易懂的代码,方法一最合适。
-
如果追求简洁与性能,推荐方法二:一次性分配 + std::iota。
-
若项目已启用 C++20,可尝试方法四。