繁体   English   中英

简单的方法来分配具有相同值的多维std :: array?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM