C&C++   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了c – 如何组合std :: copy_if和std :: transform?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
虑此代码片段:迭代第一类型T1的一个容器,用于创建应用转换函数T1-> T2的第二类型T2的第二容器,但仅用于验证谓词的T1元素(T1 – > bool)

@H_419_8@

(在下面的例子中是奇数).@H_419_8@

@H_419_8@ @H_404_13@std::vector<int> myIntVector; myIntVector.push_BACk(10); myIntVector.push_BACk(15); myIntVector.push_BACk(30); myIntVector.push_BACk(13); std::vector<std::string> myStringVectorOfOdd; std::for_each(myIntVector.begin(),myIntVector.end(),[&myStringVectorOfOdd](int val) { if (val % 2 != 0) myStringVectorOfOdd.push_BACk(std::to_String(val)); });

在这代码中不喜欢的是lambda上的捕获.有没有办法结合std :: copy_if和std :: transform以更优雅和简洁的方式实现相同的结果?@H_419_8@

解决方法

这是一个transform_if模板,它接受通常的输入迭代器对,输出迭代器和谓词以及转换函数对象.

@H_419_8@

@H_419_8@ @H_404_13@template <class InputIt,class OutputIt,class Pred,class Fct> void transform_if(InputIt first,InputIt last,OutputIt dest,Pred pred,Fct transform) { while (first != last) { if (pred(*first)) *dest++ = transform(*first); ++first; } }

您可以将它用于您的示例,如下所示.@H_419_8@

@H_419_8@ @H_404_13@transform_if(myIntVector.cbegin(),myIntVector.cend(),std::BACk_inserter(myStringVectorOfOdd),[](int n){ return n % 2 != 0; },[](int n){ return std::to_String(n); });

它不是超级简洁,但过滤和转换很好地分为无捕获的lambdas,算法本身惯用于迭代器.@H_419_8@

由于范围库为编写算法提供了更好的支持,因此基于Boost range是相同的:@H_419_8@

@H_419_8@ @H_404_13@#include <boost/range/algorithm.hpp> #include <boost/range/adaptors.hpp> using boost::adaptors::filtered; boost::transform(myIntVector | filtered([](int n){ return n % 2 != 0; }),[](int n){ return std::to_String(n); });

大佬总结

以上是大佬教程为你收集整理的c – 如何组合std :: copy_if和std :: transform?全部内容,希望文章能够帮你解决c – 如何组合std :: copy_if和std :: transform?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。