如何结合 std::copy_if 和 std::transform?

2024-03-07

考虑以下代码片段:迭代第一类型 T1 的一个容器,以创建第二类型 T2 的第二容器,应用转换函数 T1->T2,但仅适用于验证谓词的 T1 元素(T1 -> bool )

(在以下示例中为奇数)。

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 以更优雅和简洁的方式实现相同的结果?


这里有一个transform_if模板采用常用的输入迭代器对、输出迭代器和谓词以及转换函数对象。

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

您可以将其用于您的示例,如下所示。

transform_if(myIntVector.cbegin(), myIntVector.cend(),
    std::back_inserter(myStringVectorOfOdd),
    [](int n){ return n % 2 != 0; },
    [](int n){ return std::to_string(n); });

它不是超级简洁,但是过滤和转换被很好地分成了无捕获的 lambda,并且算法本身惯用地适用于迭代器。

由于范围库为组合算法提供了更好的支持,这里基于升压范围 https://www.boost.org/doc/libs/1_67_0/libs/range/doc/html/index.html:

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

using boost::adaptors::filtered;

boost::transform(myIntVector | filtered([](int n){ return n % 2 != 0; }),
    std::back_inserter(myStringVectorOfOdd), [](int n){ return std::to_string(n); });
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何结合 std::copy_if 和 std::transform? 的相关文章

随机推荐

  • 在Java中调用Python?

    我想知道是否可以使用 Jython 从 Java 代码调用 Python 函数 还是只能从 Python 调用 Java 代码 Jython 用于 Java 平台的 Python http www jython org index html
  • Docker 注册表镜像未使用

    当我尝试从本地镜像中提取图像时 它起作用了 docker login u docker p mypassword nexus3 pleiade mycomp fr 5000 docker pull nexus3 pleiade mycomp
  • 数字签名服务器上的私钥存储在哪里?

    我正在开发一个客户端服务器应用程序 需要在发送到客户端之前使用私钥对某些文件进行签名 然后 客户端将使用公钥验证签名 因此 私钥需要始终位于服务器上并且可由服务器应用程序读取 问题是我想知道在哪里存储我的私钥 这样在服务器受到威胁时更安全
  • 为什么 sizeWithFont:constrainedToSize:lineBreakMode: 返回错误的大小?

    我想要在表格单元格的标签中显示的字符串有两种可能的宽度 并且我需要计算高度 以便正确记录表格单元格的高度 然而 无论我对约束尺寸做什么 我都会得到相同的高度 这在我想要的情况下是不正确的 我正在使用的代码 CGFloat width 300
  • 如何使用prepareForReuse方法

    我发现这个方法叫做 void prepareForReuse I 阅读文档 https developer apple com documentation uikit uitableviewcell但我不明白如何使用它 当我滚动表格视图时
  • 如何使用 C# 创建包装 RTD 函数的 Excel 自动化插件?

    我有一个基于 RtdServer 的可用自动化插件 如何使用 RtdServer 在 C 中创建实时 Excel 自动化插件 https stackoverflow com questions 5397607 howto create a
  • Scikit learn 错误消息“精度和 F 分数定义不明确,在标签中设置为 0.0”[重复]

    这个问题在这里已经有答案了 我正在研究二元分类模型 分类器是朴素贝叶斯 我有一个几乎平衡的数据集 但是当我预测时 我收到以下错误消息 UndefinedMetricWarning Precision and F score are ill
  • 睡眠的意义(0)

    我以前见过Sleep 0 在我的代码的某些部分 一些无限 长while循环可用 我被告知这将使时间片可用于其他等待进程 这是真的 有没有什么意义Sleep 0 根据 MSDN 的文档Sleep http msdn microsoft com
  • Rails.logger.info 在初始化程序中不起作用

    Rails logger info在初始化程序中使用时不会写入任何信息到日志中 如何登录初始化程序 Rails logger Logger new STDOUT before MyServer Application initialize
  • 有关 ajax 回调和 drupal_process_form 的帮助

    我有一个通过仅在视图模式下显示的 nodeapi 添加的表单 用户可以从选择菜单中选择一个项目 他们的选择将通过发生更改时的 hook menu 回调自动保存到数据库中 如果用户禁用了 javascript 它将使用表单 api 正常提交
  • C# ftp上传到Linux

    我正在尝试检查 FTP 服务器上是否存在目录 在您说 使用 ListDirectory 或 使用 PrintWorkingDirectory 之前 它们并不总是有效 例如 我测试了是否ftp 网络服务器 日志 ftp webserver L
  • 从 Entity Framework 4.1 Code First 中的 NotMapped 类派生实体类

    我需要从不属于模型的基类派生两个实体类 NotMapped public abstract class BaseClass NotMapped public string SomeProperty get set public partia
  • 自动生成环境模块声明

    给定这 2 个打字稿文件 api Token ts interface Token code string export default Token and index ts export from api Token TSC 1 5 与
  • 如何将分数显示为带分数的最大值?

    我正在教授一门让学生习惯混合数字表示法的课程 然而 maxima 所做的所有计算都使用更传统的分数表示法 是否可以介绍一下3 2 as 1 1 2 我只需要这个用于乳胶输出 i4 tex 3 2 3 over 2 o4 false 所以我不
  • 导入org.opencv.highgui无法解析

    我安装了 OpenCV opencv 3 0 0 alpha 它工作正常 但我无法使用该导入 import org opencv core import org opencv highgui Highgui public class Mai
  • drawInRect:withAttributes 与 drawInRect:withFont:lineBreakMode:alignment

    我正在开发应用程序的新版本 并尝试替换已弃用的消息 但无法克服这一问题 我不明白为什么drawInRect withAttributes不管用 代码正确显示时drawInRect withFont lineBreakMode alignme
  • Apache Config Mime 类型:xlsx 文件在下载时被解释为 zip 文件,为什么?

    背景 由于某种原因 每当用户尝试使用 MSIE 从我们的 Intranet 打开 xslx excel 2007 文件时 文件下载对话框会将其解释为 zip 文件 诚然 xlsx 文件确实arezip 文件 但我们不希望出现这种行为 请用
  • Volley.NoConnectionError:java.io.EOFException 0

    我不明白这个错误 虽然我在网上搜索了很多次 但没有采取任何措施 有时会出现该错误 我做了一个使用 VOlley 库的应用程序 一切正常 我的请求 95 有效 但有时我遇到错误 11 12 12 18 54 991 I Error 1870
  • sqlite.get() 导致 TypeError: 无法读取 null 的属性 'get'

    当尝试执行 sql get 调用时 它在某些地方有效 但在其他地方无效 我似乎无法弄清楚有什么区别 数据库已成功打开 或者至少我从未收到错误并且它永远不会关闭 我还在第二个 工作示例 中使用 Discord js 但不确定这是否相关 在这个
  • 如何结合 std::copy_if 和 std::transform?

    考虑以下代码片段 迭代第一类型 T1 的一个容器 以创建第二类型 T2 的第二容器 应用转换函数 T1 gt T2 但仅适用于验证谓词的 T1 元素 T1 gt bool 在以下示例中为奇数 std vector