首页 > 解决方案 > C++ 使用逻辑初始化 STL 容器,而不是手写数据

问题描述

我有static inline一个班级的成员 - 一个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]

标签: c++stl

解决方案


您可以使用 , 执行此操作std::generate_nstd::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);
}

印刷

{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}

推荐阅读