[英]simple method to assign a multi-dimensional std::array with same value?
我正在寻找一种简单的方法来分配具有相同值的多维数组? 例如
using namespace std;
array<array<array<int, 2>, 3>, 4> a;
并希望a[:][:][:]
所有元素均为10。我不想使用3个循环。 一圈就好。
简单的方法是
for (auto& a1:a) for (auto& a2:a1) for (auto& a3:a2)
a3 = 10;
更为直接,但通用性较低:
a = {{
{{ {{ 10, 10 }}, {{ 10, 10 }}, {{ 10, 10 }} }},
{{ {{ 10, 10 }}, {{ 10, 10 }}, {{ 10, 10 }} }},
{{ {{ 10, 10 }}, {{ 10, 10 }}, {{ 10, 10 }} }},
{{ {{ 10, 10 }}, {{ 10, 10 }}, {{ 10, 10 }} }},
}};
最后,由于std::array<>
确保连续存储,因此您可以“作弊”并执行
std::fill(
&*a.front().front().begin(),
&*a.back().back().end(),
10);
有趣的是, clang
为所有三种方法生成相同的汇编 :
T
n维数组 #include <array>
#include <algorithm>
namespace detail {
struct nested_range_helper {
template <typename T> static auto array_inner_begin(T& o) { return std::addressof(o); }
template <typename T, size_t N> static auto array_inner_begin(std::array<T, N>& o) { return array_inner_begin(o.front()); }
template <typename T> static auto array_inner_end (T& o) { return std::addressof(o) + 1; }
template <typename T, size_t N> static auto array_inner_end (std::array<T, N>& o) { return array_inner_end(o.back()); }
};
}
template <typename T>
auto innermost_begin(T& v) { return detail::nested_range_helper::array_inner_begin(v); }
template <typename T>
auto innermost_end(T& v) { return detail::nested_range_helper::array_inner_end(v); }
template <typename T, typename V> void method3(T& a, V v = V{}) {
std::fill(innermost_begin(a), innermost_end(a), v);
}
int main() {
std::array<std::array<std::array<int, 2>, 3>, 4> a;
std::array<std::array<double, 7>, 21> b;
method3(a, 10);
method3(b, 3.14);
}
使用clang时仍发出相同的优化程序集: https : //godbolt.org/g/d1kj3m
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.