gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 01:56:22 25 4
gpt4 key购买 nike

我有一个 static inline类(class)成员 - 一个 std::vector .我需要用数字填充它 - 0 到 std::numeric_limits<uint16_t>::max() - 1 .

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

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

容器需要是static , 但如果有办法做我想做的事,则要求它不是 inline , 那就这样吧。

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

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

最佳答案

您可以使用 std::generate_nstd::iota 执行此操作,但不能在 vector 构建期间执行此操作。

RangeV3 可以做类似的事情:

Compiler Explorer

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

关于C++ 使用逻辑而不是手写数据来初始化 STL 容器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69876932/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com