c++ - C++ 使用逻辑初始化 STL 容器,而不是手写数据
问题描述
我有static inline
一个班级的成员 - 一个std::vector
. 我需要用数字填充它 - 0 到std::numeric_limits<uint16_t>::max() - 1
。
我知道容器有列表初始化,但我不想想出一个可以扩展到 1、2、3,一直到 65534 的宏/结构。
static inline
考虑到它是一个变量,我想知道是否有办法用这样的数字序列干净地初始化容器。
容器需要是static
,但如果有一种方法可以做我想做的事情,它要求它不是inline
,那就这样吧。
一种方法是编写一个将填充容器的函数,然后使用#pragma startup myfunc
or [[gnu::constructor]]
,但宏和属性都不是实际标准。而且我不想拥有init_mylibrary()
类似于glfwInit()
用户main()
在使用之前必须调用的功能mylibrary
。
一种可能可行的方法是通过构造函数声明容器的大小并提供一个自定义分配器,该分配器将使用连续整数初始化内存,但为此任务编写一个完整的分配器似乎有点过头了。必须有一种方法可以干净利落地做到这一点,就像 Ruby 允许人们编写的那样Array.new(4) { |i| i + 10 } #=> [10, 11, 12, 13]
解决方案
您可以使用 , 执行此操作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);
}
印刷
{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}
推荐阅读
- python - 如何遍历数据框
- ios - 我在 UICollectionViewController 中的单元格消失了
- java - 如何在java中按字符串的数据类型拆分字符串?
- amazon-web-services - 无法创建 CloudFormation 堆栈
- ios - 在运行主要目标 Xcode 之前构建所有框架
- ansible - 列出将被“yum autoremove”删除的包?
- html - CSS 错误:为什么页眉水平对齐和页脚不均匀对齐?
- php - 如何使用从数据库行请求的布尔值在 laravel-php 中制作触发器?
- javascript - 用 Node.js 写出巨大的 json (4 Gb)
- magento2 - 1 个异常:异常 #0 (Magento\Framework\Exception\LocalizedException):方法无效 Magento\Catalog\Block\Navigation::canShowBlock