C++初始化/填充静态成员 std::数组元素到特定值
C++ initialize/fill static member std::array elements to specific value
我想知道是否有正确的方法可以做到这一点。
给定示例:
struct Test {
static std::array<unsigned, 123> data;
};
std::array<unsigned, 123> Test::data = {};
如果我想将data
中的所有元素设置为某个值,例如 5。
我可以做这样的事情:
struct Test {
static std::array<unsigned, 123> data;
private:
static decltype(data) init_data_arr() {
decltype(data) arr = {};
arr.fill(5);
return arr;
}
};
std::array<unsigned, 123> Test::data = Test::init_data_arr();
但是,我会分配一个额外的数组,并对所有内存进行复制,这似乎并不理想。
另一个内存占用较少的选项是:
struct Test {
static bool is_init;
static std::array<unsigned, 123> data;
Test() {
if (!is_init) {
is_init = true;
data.fill(5);
}
}
};
bool Test::is_init = false;
std::array<unsigned, 123> Test::data = {};
但是现在我在构建测试结构时有额外的开销。
现在我知道你可以像这样初始化 pod 数组:std::array<int, 3> a = {1, 2, 3};
但对于N
大小的数组来说,维护起来很快就会变得很糟糕。
我似乎遇到的每个解决方案都只在数组类上使用fill
成员函数,但总是将数组视为非静态成员变量,或者它在 main 中初始化它们,这两者都对我的情况没有真正的帮助。
编辑: 我创建了这个实用程序标头,它概括了第二个选项。 #pragma 一次
#include <utility>
#include <iterator>
#include <algorithm>
#include <type_traits>
namespace Utils {
template<typename Container>
using element_type_t = std::remove_reference_t<decltype(*std::begin(std::declval<Container&>()))>;
template<class Container>
static Container create_filled_container(const element_type_t<Container>& value) {
Container container = {};
std::fill(container.begin(), container.end(), std::move(value));
return container;
}
}
这可能会得到更多改进,但它似乎有效。用法如下:
std::array<unsigned, 123> Test::data = Utils::create_filled_container<decltype(data)>(456);
这会将所有元素设置为您指定的任何元素。
编辑2: 所以我做了更多的测试,看起来调用一个函数来填充数组与手动操作并不总是产生相同的程序集。
我在这里设置了一个演示!
编辑3: 更改了一些东西,因此它可以是constexpr,这是其当前形式:
template<class Container>
static constexpr Container create_filled_container(const element_type_t<Container>& value) {
Container container = {};
for (auto it = container.begin(); it != container.end(); ++it)
*it = value;
return container;
}
现在产生相同的组件。
使用 constexpr 函数或 lambda 初始化它。不会生成运行时代码。
#include <array>
#include <iostream>
template <unsigned len, unsigned val>
constexpr std::array<unsigned, len> initialize_array()
{
std::array<unsigned, len> ret{};
for (int i = 0; i < len; i++)
ret[i] = val;
return ret;
}
struct Test {
constexpr static std::array<unsigned, 123> data{ initialize_array<123,5>() };
};
int main() {
std::cout << Test::data[4] << "n";
}
相关文章:
- 数组元素打印的递归方法
- 如何将字节数组元素替换为修改的十六进制 ASCII 符号?
- 为什么使用数组元素查找最大数字的程序不起作用?
- 数组元素更改值?
- 如何访问宏中定义的数组元素
- 将数组元素递增 1
- C++函数,它将数组、谓词和运算符作为参数,并将运算符应用于满足谓词的数组元素
- 存储指向动态数组元素的指针
- C++通过别名指针以静默方式将错误的类型分配给数组元素
- 在 std::map 中插入数组元素
- 使用指针访问数组元素时出现意外结果
- c++ 使用动态分配运算符反向数组元素
- 为什么在 c++ 中分配 char 数组元素时,分配的字符会被销毁?
- 缺少数组元素问题
- 如何在类中制作 2D 数组元素,然后在其构造函数中指定其维度?
- 创建一个函数来转换数组元素的类型并返回数组的地址
- 删除在结构 c++ 中声明的数组元素
- C++初始化/填充静态成员 std::数组元素到特定值
- 是否必须重置 std::数组元素
- 访问std::pair数组元素时出错