gpt4 book ai didi

C++ 将静态成员 std::array 元素初始化/填充为特定值

转载 作者:行者123 更新时间:2023-11-30 04:46:37 32 4
gpt4 key购买 nike

我想知道是否有正确的方法来做到这一点。

举个例子:

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:所以我做了一些更多的测试,看起来调用一个函数来填充数组与手动执行它并不总是产生相同的程序集。

我已经设置了一个演示 here!

编辑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";
}

关于C++ 将静态成员 std::array 元素初始化/填充为特定值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56677417/

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