使用 std::fill 与 std::integer_sequence 填充 std::数组

std::array filling using std::fill vs std::integer_sequence

提问人:suspiciously_large_carrot 提问时间:11/7/2023 最后编辑:suspiciously_large_carrot 更新时间:11/7/2023 访问量:89

问:

我真的没有任何问题,我只是有点好奇。我一直在浏览 SO 并看到了这篇文章。这是一个非常酷的技巧,但它比普通的旧 std::fill 有什么优势吗?

我一直在快速工作台上玩它,似乎它在 -Og 和 -O3 的性能方面没有任何优势,显然它对可读性没有帮助。我想不出任何理由使用它。我是 c++ 的新手,也许我做错了什么,所以这是我的填充版本代码:

template<typename T, size_t N, typename... Ts>
auto make_fill_array(Ts&&... args) noexcept(std::is_nothrow_constructible<T>::value)
    -> std::array<T, N> {
    std::array<T, N> ret;
    std::fill(ret.begin(), ret.end(), T{std::forward<Ts>(args)...});
    return ret;
}

此外,还有一个用于容器的模板专用化,这些容器可以使用 std::initializer_list 构造,但这只是一些样板。

编辑: 我被问到使用情况。我并没有真正考虑过这段代码,因为它不是我个人项目的一部分,它只是个人的好奇心,所以我的测试就是这样简单的东西。

auto fillarray = make_fill_array<Point, 10>(1, 6);

auto fillarray2 = make_fill_array<std::vector<Point>, 5>(5, Point{1, 6});
C++ 模板

评论

2赞 Jesper Juhl 11/7/2023
首先使用任何正确的内容。其次,使用最易读的。如果全部相等,则使用性能最好的方法。
2赞 Ben Voigt 11/7/2023
您的版本需要一个可复制的 .另一个独立于其构造函数参数构造每个实例。TT
0赞 Ted Lyngmo 11/7/2023
您的填充版本似乎在许多方面都不正确。你会如何使用它?
0赞 suspiciously_large_carrot 11/7/2023
@TedLyngmo我已经发现它不适用于非默认的可构造和不可复制的可分配。但是,我的代码还有什么其他方式被破坏呢?当我使用 pod 和 std 容器测试它时,它运行良好。
0赞 Ted Lyngmo 11/7/2023
@suspiciously_large_carrot 也许您可以添加测试函数时使用的代码,以便用法变得清晰。

答:

2赞 T.C. 11/7/2023 #1

这需要的不仅仅是电池组扩展解决方案。T

如果该类型不是默认可构造的,则将不起作用(至少对于 )。std::array<T, N> ret;N > 0

如果它不可复制分配,那么它也将不起作用。(还具有成员功能。fillstd::arrayfill

最后,如果它不能移动构造,那么就行不通。return ret;

评论

0赞 suspiciously_large_carrot 11/7/2023
嗯,这是有道理的。但我不明白最后一点,为什么它需要移动?它通常只是 NRVOed,即使 NRVO 不会启动,它不会只是复制吗?