将二进制操作员应用于数组中的每个元素
Apply a binary operator to each element in an array
给定一个二进制函数(或类似函子(对象,该对象采用两个类型的T*
和一个大小并返回T*
,这是将该函数应用于每个对象的规范方法数组,返回新的?
,即等同的东西,但比以下几点较短且较小的错误:
template<typename T, typename O>
T* apply(const T* a1, const T* a2, size_t size, O op) {
T* out = new[size];
for (size_t i = 0; i < size; i++) {
out[i] = op(a1[i], a2[i]);
}
return out;
}
我对输出的分配方式的细节不太大。在上面的示例中,它分配在堆上,但也许其他变体覆盖了其中一个输入或写入提供的缓冲区,或者也许是使用std::array<>
并返回,等等。
您提到使用数组的工作C风格的C风格阵列参数。
如果适用(呼叫站点的限制(,则可以使用std::array
来避免尺寸信息的丢失,同时仍在编写一个尺寸 - 敏捷的功能模板,并以两个数组参数都相同的约束大小(当您执行典型的拉链和地图操作时,我们可能会期望这(。
例如。使用 std::transform
将二进制操作员应用于to数组参数中的配对元素:
#include <algorithm>
#include <array>
#include <iostream>
template <typename T, typename BinaryOperator, std::size_t N>
auto apply(const std::array<T, N>& arr1, const std::array<T, N>& arr2,
const BinaryOperator& op) {
std::array<T, N> result{};
std::transform(arr1.begin(), arr1.end(), arr2.begin(), result.begin(), op);
return result;
}
int main() {
const std::array<int, 5> arr1 = {1, 2, 3, 4, 5};
const std::array<int, 5> arr2 = {6, 7, 8, 9, 10};
const auto results = apply(arr1, arr2, [](int i, int j) { return i + j; });
for (const auto num : results) {
std::cout << num << " ";
} // 7 9 11 13 15
}
或,如果您可以使用C 14,则std::integer_sequence
与参数包扩展合并:
#include <array>
#include <iostream>
#include <utility>
namespace detail {
template <typename Array, typename BinaryOperator, std::size_t... I>
Array apply_impl(const Array& arr1, const Array& arr2, const BinaryOperator& op,
std::index_sequence<I...>) {
return {op(arr1[I], arr2[I])...};
}
}
template <typename T, typename BinaryOperator, std::size_t N,
typename Indices = std::make_index_sequence<N>>
auto apply(const std::array<T, N>& arr1, const std::array<T, N>& arr2,
const BinaryOperator& op) {
return detail::apply_impl(arr1, arr2, op, Indices{});
}
int main() {
const std::array<int, 5> arr1 = {1, 2, 3, 4, 5};
const std::array<int, 5> arr2 = {6, 7, 8, 9, 10};
const auto results = apply(arr1, arr2, [](int i, int j) { return i + j; });
for (const auto num : results) {
std::cout << num << " ";
} // 7 9 11 13 15
}
相关文章:
- Mongodb c++驱动程序:如何查询元素的数组
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 使用strcpy将char数组的元素复制到另一个数组
- 如何将元素添加到数组的线程安全函数?
- cpp二进制搜索问题,计算给定数组中输入元素的出现次数
- 输出没有重复元素的动态数组(收缩数组)C++
- 数组中最大的非重复元素
- 数组元素打印的递归方法
- 对字符数组中的元素执行逐位操作
- 缓存std::数组的选定元素,并在c++中自动保持其一致性
- 如何计算数组中元素的位数?(不是数组的长度),并计算其数字的总和
- 通过交换元素使数组相同
- 按平均值替换数组中的元素
- 打印矢量数组中的所有元素
- 如何将字节数组元素替换为修改的十六进制 ASCII 符号?
- 如何为 c++ 的不同变量类型的结构元素创建动态数组?
- 如何将元素从向量转移到新数组?
- 如何在向量数组中插入元素?
- 为什么 2 个相同数组的元素彼此相等
- C++ 中的二维整数数组,每行中的元素数量不均匀