C++填充多维标准::数组

C++ filling multidimensional std::arrays

本文关键字:数组 标准 填充 C++      更新时间:2023-10-16

要声明一个矩阵,其所有元素都具有一定的值,使用std::array我知道的唯一方法如下所示:

std::array<std::array<int, dim_1>, dim_2> matrix;
for (auto it = matrix.begin(); it != matrix.end(); ++it) 
std::fill(it->begin(), it->end(), number);

有没有更好、更简洁的方法?

auto matrix = std::array<std::array<int, 4>, 4>();
const auto value = 64;

单行:

std::for_each(matrix.begin(), matrix.end(), [value](auto& column) { std::for_each(column.begin(), column.end(), [value](auto& element) {element = value; }); });

另一个:

std::for_each(matrix.begin(), matrix.end(), [value](auto& column) { std::fill(column.begin(), column.end(), value); });

实际上可读的东西:

for (auto& column : matrix) {
for (auto& element : column) {
element = value;
}
}

我不知道这些是否真的是列

这也在最新的MSVC上编译,看起来很有趣:

std::fill(matrix.begin(), matrix.end(), std::array{ value, value, value, value });

如果你正在寻找简洁,你可以用一个填充数组来填充它:

decltype(matrix[0]) temp;
temp.fill(5);
matrix.fill(temp);

从技术上讲,您可以删除临时维度(假设为非零维度(:

matrix[0].fill(5);
matrix.fill(matrix[0]);

为了使它执行并填充到位,您必须依靠编译器来透视它。或者,您可以从 C++20 开始将其放入constexpr函数中,并根据需要保证编译时结果。

使用辅助功能:

namespace detail
{
template <typename T, std::size_t...Is>
constexpr std::array<T, sizeof...(Is)>
make_array(const T& value, std::index_sequence<Is...>)
{
return {{(static_cast<void>(Is), value)...}};
}
}
template <std::size_t N, typename T>
constexpr std::array<T, N> make_array(const T& value)
{
return detail::make_array(value, std::make_index_sequence<N>());
}

然后

/*const*/ auto matrix = make_array<dim_2>(make_array<dim_1>(value));

fill相比,它的优势在于它支持非默认的可构造类型。

与之后的赋值相比,辅助函数(即使使用std::fill实现(的优势在于您可以初始化const变量:)