gpt4 book ai didi

c++ - 连接一系列 std::arrays

转载 作者:可可西里 更新时间:2023-11-01 16:27:21 26 4
gpt4 key购买 nike

请考虑以下内容:( Wandbox )

#include <array>
#include <algorithm>
#include <iostream>

template<typename T, int N, int M>
auto concat(const std::array<T, N>& ar1, const std::array<T, M>& ar2)
{
std::array<T, N+M> result;
std::copy (ar1.cbegin(), ar1.cend(), result.begin());
std::copy (ar2.cbegin(), ar2.cend(), result.begin() + N);
return result;
}

int main()
{
std::array<int, 3> ar1 = {1, 2, 3};
std::array<int, 2> ar2 = {4, 5};
auto result = concat<int, 3, 2>(ar1, ar2);
for (auto& x : result)
std::cout << x << " ";
std::cout << std::endl;
return 0;
}

给定一个序列 std::array<T, length1> , std::array<T, length2> , ..., std::array<T, lengthK> , 我怎样才能概括上面的代码并编写一个将序列连接成 std::array<T, sum(lengths)> 的函数?

如果有一种方法可以编写一个可重用的函数,使用给定的二进制操作减少类似的模板类序列,那就太好了,例如,使用 concat在上面的示例中,而不是编写一个特殊的方法(每次二进制操作更改时都必须重写)。

(IIUC,相关的标准库算法(accumulatereduce)仅在二元运算结果的类别始终相同的情况下才有效。)

最佳答案

这是一个简单的 C++17 解决方案,来自 fold expressions :

#include <array>
#include <algorithm>

template <typename Type, std::size_t... sizes>
auto concatenate(const std::array<Type, sizes>&... arrays)
{
std::array<Type, (sizes + ...)> result;
std::size_t index{};

((std::copy_n(arrays.begin(), sizes, result.begin() + index), index += sizes), ...);

return result;
}

使用示例:

const std::array<int, 3> array1 = {{1, 2, 3}};
const std::array<int, 2> array2 = {{4, 5}};
const std::array<int, 4> array3 = {{6, 7, 8, 9}};

const auto result = concatenate(array1, array2, array3);

Live demo

关于c++ - 连接一系列 std::arrays,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42749032/

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