为什么STL中没有transform

为什么STL中没有transform

本文介绍了为什么STL中没有transform_if?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

当想要做一个有条件的复制(1. copy_if )时,出现了一个用例,但从一个容器的值到一个容器指针的值。doable with transform )。



使用可用工具,我无法在不到两个步骤中 :

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



现在我们可以调用 remove_if pv ,并且不需要临时的,但是更好的是,(一元操作)类似这样:

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

//示例调用
transform_if(v.begin(),v.end(),back_inserter(ph),
[] arg){return& arg;},// 1.
[](ha& arg){return arg.i




  1. 有可用的STL工具有更优雅的解决方法吗? >
  2. 有没有理由 transform_if 不存在的原因?


解决方案现有工具的组合是否有足够的解决方法和/ / div>

标准库支持基本算法。



容器和算法应尽可能相互独立。



同样,可以由现有算法组成的算法也只是很少包括在内。



如果你需要一个变换, 。如果你想要/今天/,组成的准备好,而不是开销,你可以使用一个范围库具有,例如,例如:

  v |过滤(arg1%2)|转换(arg1 * arg1 / 7.0)

由于@hvd在注释中指出, transform_if double导致不同的类型( double ,在这种情况下)。组合顺序很重要,使用Boost Range,你也可以写:

  v |变换(arg1 * arg1 / 7.0)|过滤(arg1   

导致不同的语义。这带来了点:

See a sample Live On Coliru

#include <boost/range/algorithm.hpp>
#include <boost/range/adaptors.hpp>

using namespace boost::adaptors;

// only for succinct predicates without lambdas
#include <boost/phoenix.hpp>
using namespace boost::phoenix::arg_names;

// for demo
#include <iostream>

int main()
{
    std::vector<int> const v { 1,2,3,4,5 };

    boost::copy(
            v | filtered(arg1 % 2) | transformed(arg1 * arg1 / 7.0),
            std::ostream_iterator<double>(std::cout, "\n"));
}

这篇关于为什么STL中没有transform_if?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

10-31 19:09