【发布时间】:2019-05-04 21:48:11
【问题描述】:
给定一个二进制仿函数(或类仿函数)对象,它接受两个 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<> 并返回它,等等。
【问题讨论】:
-
很确定 stl 中的模式是使用输出迭代器(例如,
std::back_inserter)。 -
@StephenNewell - 当然,但是“从两个不同的范围迭代元素对”部分怎么样?这就是我坚持的部分。
-
对不起,我把你的代码误读为
op(a1[i], a1[i])。为什么不只使用两个迭代器并在每个迭代器上使用std::advance?是否要让调用者确保两个范围的大小相同取决于您(看起来std::equal具有同时采用三个和四个迭代器的形式)。 -
我想你可以使用
std::transform()的版本,它接收两个输入迭代器和一个二元运算符(this page 中的版本 3 或 4) -
@max66 - 谢谢,这是我正在寻找的答案。不知何故,我仍然没有意识到这些形式......
标签: c++ templates c++14 array-algorithms