C++ 使用逻辑初始化 STL 容器,而不是手写数据

sel*_*mba 3 c++ stl

我有一个static inline班级的成员 - an std::vector。我需要用数字填充它 - 0 到std::numeric_limits<uint16_t>::max() - 1

我知道容器有列表初始化,但我不想提出一个将扩展到 1,2,3,一直到 65534 的宏/结构。

我想知道是否有一种方法可以用这样的数字序列干净地初始化容器,考虑到它是一个static inline变量。

容器必须是这样static,但如果有一种方法可以做我想做的事情,但要求它不这样inline,那就这样吧。

一种方法是编写一个函数来填充容器,然后使用#pragma startup myfuncor [[gnu::constructor]],但宏和属性都不在实际标准中。我不想拥有类似于init_mylibrary()用户glfwInit()main()使用之前必须调用的功能mylibrary

一种可能有效的方法是通过构造函数声明容器的大小,并提供一个自定义分配器,该分配器将使用连续的整数初始化内存,但为此任务编写整个分配器似乎有点矫枉过正。必须有一种方法可以干净地做到这一点,就像 Ruby 允许人们编写的那样Array.new(4) { |i| i + 10 } #=> [10, 11, 12, 13]

seh*_*ehe 5

您可以使用std::generate_n,来执行此操作std::iota,但不能在向量构建过程中执行此操作。

RangeV3 也可以做类似的事情:

编译器资源管理器

#include <range/v3/all.hpp>
using ranges::views::iota;

struct X {
    std::vector<int> v;

    X(int n) : v(ranges::to_vector(iota(0, n))) {}
};

#include <fmt/ranges.h>
int main()
{
    X x(42);
    fmt::print("{}\n", x.v);
}
Run Code Online (Sandbox Code Playgroud)

印刷

{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41}
Run Code Online (Sandbox Code Playgroud)

  • @AdrianMole 是的:https://godbolt.org/z/d3eMTExaj (2认同)