【发布时间】:2014-06-28 02:12:31
【问题描述】:
当想要进行连续复制时出现了一个用例(1. 可以使用copy_if)但从值容器到指向这些值的指针容器(2. 可以使用transform)。
使用可用的工具,我不能在不到两个步骤中do it:
#include <vector>
#include <algorithm>
using namespace std;
struct ha {
int i;
explicit ha(int a) : i(a) {}
};
int main()
{
vector<ha> v{ ha{1}, ha{7}, ha{1} }; // initial vector
// GOAL : make a vector of pointers to elements with i < 2
vector<ha*> ph; // target vector
vector<ha*> pv; // temporary vector
// 1.
transform(v.begin(), v.end(), back_inserter(pv),
[](ha &arg) { return &arg; });
// 2.
copy_if(pv.begin(), pv.end(), back_inserter(ph),
[](ha *parg) { return parg->i < 2; }); // 2.
return 0;
}
当然,我们可以在pv 上调用remove_if 并消除临时的需要,但更好的是,implement(对于一元操作)并不难:
template <
class InputIterator, class OutputIterator,
class UnaryOperator, class Pred
>
OutputIterator transform_if(InputIterator first1, InputIterator last1,
OutputIterator result, UnaryOperator op, Pred pred)
{
while (first1 != last1)
{
if (pred(*first1)) {
*result = op(*first1);
++result;
}
++first1;
}
return result;
}
// example call
transform_if(v.begin(), v.end(), back_inserter(ph),
[](ha &arg) { return &arg; }, // 1.
[](ha &arg) { return arg.i < 2; });// 2.
- 使用可用的 C++ 标准库工具是否有更优雅的解决方法?
- 库中不存在
transform_if是否有原因?现有工具的组合是否是一种足够的解决方法和/或被认为表现良好?
【问题讨论】:
-
(IMO) 名称
transform_if暗示“仅在满足某个谓词时才进行转换”。您想要的更具描述性的名称是copy_if_and_transform! -
@OliCharlesworth,实际上
copy_if还暗示“仅在满足某个谓词时才复制”。它同样模棱两可。 -
@Shahbaz:但这就是
copy_if所做的,对吧? -
如果关于这种东西的名称的争议是不实施它的实际原因,我不会感到惊讶!
-
也许我在这些 cmets 中遗漏了一些东西,但如果转换可以是不同的不兼容类型,
transform_if怎么可能复制那些它不转换的元素?问题中的实现正是我期望这样一个函数做的事情。
标签: c++ c++-standard-library stl-algorithm