gpt4 book ai didi

c++ - 对数组中的每个元素应用二元运算符

转载 作者:行者123 更新时间:2023-11-30 03:16:48 27 4
gpt4 key购买 nike

给定一个二元仿函数(或类仿函数)对象,它接受两个类型为 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 来避免丢失大小信息,同时仍然使用约束两个数组参数应具有相同的大小(我们可以预期,因为您正在执行典型的 zip 和 map 操作)。

例如使用 std::transform将二元运算符应用于数组参数中的成对元素:

#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
}

关于c++ - 对数组中的每个元素应用二元运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55987072/

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