附加到 std::array

Posted

技术标签:

【中文标题】附加到 std::array【英文标题】:Append to std::array 【发布时间】:2016-12-30 15:39:24 【问题描述】:

由于我找不到这样的函数(不正确?),我正在尝试创建一个编译时函数 (constexpr) 函数,它采用 std::array<T,n> arrT t 并返回一个新的std::array<T,n+1>t 添加到 arr 的末尾。我是这样开始的:

template <typename T, int n>
constexpr std::array<T,n+1> append(std::array<T,n> a, T t);

template <typename T>
constexpr std::array<T,1> append(std::array<T,0> a, T t)

  return std::array<T,1>t;


template <typename T>
constexpr std::array<T,2> append(std::array<T,1> a, T t)

  return std::array<T,2>a[0], t;

我在这里卡住了。我需要的是一种在初始化列表的第一个 n 位置扩展 a 的方法,然后添加 t 添加末尾。那可能吗?或者有其他方法吗?

【问题讨论】:

【参考方案1】:

当然有可能:std::index_sequence&lt;I...&gt; 是你的朋友!您只需分派到一个函数,该函数以合适的 std::index_sequence&lt;I...&gt; 作为参数并使用所有值扩展包。例如:

template <typename T, std::size_t N, std::size_t... I>
constexpr std::array<T, N + 1>
append_aux(std::array<T, N> a, T t, std::index_sequence<I...>) 
    return std::array<T, N + 1> a[I]..., t ;

template <typename T, std::size_t N>
constexpr std::array<T, N + 1> append(std::array<T, N> a, T t) 
    return append_aux(a, t, std::make_index_sequence<N>());

【讨论】:

哇,对我来说简直是魔法!近年来,C++ 确实取得了长足的进步。谢谢! 值得补充的是,对于 c++11,integer_sequence 有可用的有效实现,例如this one 不幸的是它不是开箱即用的。 @kalj:实际上,并没有什么魔力。也许这对我来说很自然,因为我发布了this answer,这导致了相关的proposal。 ;-) @DietmarKühl,如果这很神奇,那么答案对我来说就是纯粹的巫术。不过有很多很酷的东西要学! 好的,稍作修改即可使用。结果N 必须是std::size_t,还有一个小错字,append 应该返回一个大小为N+1 的数组。您可能需要更新此内容。【参考方案2】:

很容易将 Dietmar 的答案扩展到一个可以让您对两个数组进行 constexprcatenate 的工具:

// constexpr util to catenate two array's.
//
// Usage:
//
// constexpr std::array<int, 2> a1 =  1, 2 ;
// constexpr std::array<int, 2> a2 =  3, 4 ;
//
// constexpr auto a3 = catenate_array(a1, a2);

template <typename T, std::size_t N, std::size_t M, std::size_t... I, std::size_t... J>
constexpr std::array<T, N + M>
catenate_array_aux(std::array<T, N> a1, std::array<T, M> a2, std::index_sequence<I...>, std::index_sequence<J...>) 
    return std::array<T, N + M> a1[I]..., a2[J]... ;


template <typename T, std::size_t N, std::size_t M>
constexpr std::array<T, N + M> catenate_array(std::array<T, N> a1, std::array<T, M> a2) 
    return catenate_array_aux(a1, a2, std::make_index_sequence<N>(), std::make_index_sequence<M>());

【讨论】:

以上是关于附加到 std::array的主要内容,如果未能解决你的问题,请参考以下文章

使用jquery将项目附加到附加项目

何时片段不附加到活动而仅附加到上下文?

Android 将文件附加到 GMAIL - 无法附加空文件

当 Python 只应附加到一个列表时,它会附加到两个列表

将附加条件附加到查询

将附加信息(数据)附加到数据框列值