【C++】std::transform、std::back_inserter使用

2023-05-16

std::transform函数可以用于对一个序列中的每个元素进行转换,并将结果存储到另一个序列中。

们需要传递三个参数:源序列的起始迭代器、源序列的结束迭代器和目标序列的起始迭代器。

此外,我们还需要传递一个函数对象,用于对源序列中的每个元素进行转换。

以下是一个示例代码,演示了如何使用std::transform函数对一个序列中的每个元素进行转换:

#include <iostream>
#include <vector>
#include <algorithm>

double calc_confi_interval(double rtt_interval_ratio) {
    return 1.96 * rtt_interval_ratio / std::sqrt(2);
}

int main() {
    std::vector<double> rtt_interval_ratios = {0.5, 0.6, 0.7, 0.8, 0.9};
    std::vector<double> rtt_interval_confidences(rtt_interval_ratios.size());
    int N_intervals = 3;
    std::transform(rtt_interval_ratios.begin(), rtt_interval_ratios.begin() + N_intervals,
                   rtt_interval_confidences.begin(), calc_confi_interval);
    for (int i = 0; i < rtt_interval_confidences.size(); i++) {
        std::cout << rtt_interval_confidences[i] << " ";
    }
    std::cout << std::endl;
    return 0;
}

当然 这里的函数也可以用lamda表达式来表征。

下面的例子

std::unordered_map<std::string, ComplexMat> mat_set;
std::vector<ComplexMat> res;
res.reserve(mat_set.size());
std::transform(mat_set.begin(), mat_set.end(), std::back_inserter(res),
                 [](const auto& pair) { return pair.second; });

这段代码使用了lambda表达式作为std::transform函数的第四个参数,用于将mat_set中的所有ComplexMat对象存储到res向量中。

lambda表达式是一种匿名函数,可以在需要时定义并使用。在这个代码中,lambda表达式的定义如下:

[](const auto& pair) { return pair.second; }

这个lambda表达式接受一个参数pair,表示mat_set中的一个键值对。在lambda表达式的函数体中,我们使用pair.second获取键值对中的ComplexMat对象,并将其作为返回值返回。

std::transform函数中,我们将mat_set序列中的每个键值对都传递给lambda表达式进行处理,并将返回的ComplexMat对象存储到res向量中。由于res向量的大小与mat_set中键值对的数量相同,因此我们可以使用std::reserve函数预分配足够的空间,以避免不必要的内存分配和复制操作。

std::back_inserter是一个迭代器适配器,可以将元素插入到容器的末尾。在使用std::back_inserter时,我们需要将其作为目标容器的插入迭代器使用,以便将元素插入到容器的末尾。

在这个代码中,我们使用std::back_inserter作为std::transform函数的第四个参数,用于将转换后的元素插入到res向量的末尾。由于std::back_inserter是一个插入迭代器,因此它会自动将元素插入到res向量的末尾,而不需要我们手动调用push_back函数。

下面给出另外一个例子,帮助更好地理解

#include <iostream>
#include <vector>
#include <algorithm>

int main() {
    std::vector<int> v1 = {1, 2, 3};
    std::vector<int> v2;
    std::transform(v1.begin(), v1.end(), std::back_inserter(v2),
                   [](int x) { return x * 2; });
    for (int i = 0; i < v2.size(); i++) {
        std::cout << v2[i] << " ";
    }
    std::cout << std::endl;
    return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【C++】std::transform、std::back_inserter使用 的相关文章

  • STL容器的范围插入函数在c ++ 11下返回void?

    刚刚学习c 所以我可能没有正确理解这一点 但我只读到范围插入函数在新标准下返回一个迭代器 C Primer 5th Ed cplusplus com http www cplusplus com reference string basic
  • std::condition_variable::wait 带谓词

    在 std condition variable 的文档中 存在以谓词函数作为参数的 wait 重载 该函数将等待 直到谓词函数为 true 的第一次wake up In the 文档 http en cppreference com w
  • 为什么我不能在 C++ 中的 `std::map` 中存储引用?

    我知道引用不是指针 而是对象的别名 但是 我仍然不明白这对我作为程序员到底意味着什么 即幕后的引用是什么 我认为理解这一点的最好方法是理解为什么我无法在地图中存储参考 我知道我需要停止将引用视为指针的语法糖 只是不知道如何 按照我的理解 引
  • GCC 4.7.2:带有指向成员函数指针的 std::thread

    在编写测试代码时这个问题 https stackoverflow com questions 15080015 stdthread with pointer to data member我发现下面的注释行无法在 GCC 4 7 2 上编译
  • css 旋转与过渡似乎会影响其他元素的不透明度?

    我遇到了使用 1s 过渡通过 CSS3 变换旋转 DIV 的问题 在 OSX 10 7 5 上的 Chrome 23 和 Safari 6 中 在 rotate divs 转换期间 其他容器中的字体会稍微变暗 关于造成这种情况的原因以及如何
  • 确定 std::istream 长度的更好方法?

    有没有比以下更好的方法来确定 std istream 的长度 std istream pcStream GetSomeStream pcStream gt seekg 0 ios end unsigned int uiLength pcSt
  • 值类型不完整的映射

    我收到以下错误 class Test std map
  • 旋转后获取线的新位置

    我需要在一条线上使用 RotateTransform 方法找到旋转后线的新坐标 例如 在这一行之后 line RenderTransform new RotateTransform 25 0 0 line X1其他三个属性不会改变 我找到了
  • 为什么我收到 string does not name a type 错误?

    game cpp include
  • 如何从傅里叶变换绘制频谱

    我想绘制音乐文件的频谱 就像他们在 Audacity 中所做的那样 因此 我希望 x 轴上以赫兹为单位的频率 y 轴上以振幅 或 desibel 为单位 我将歌曲 大约 2000 万个样本 分成一次 4096 个样本的块 这些块将产生 20
  • IE9-11 检测变换样式:preserve-3d

    我为一个项目制作了一个 3d 类型的菜单 自然 IE 会引起问题 因为 IE10 即使 3d 变换工作 也不支持变换样式 preserve 3d 我尝试了解决方法 通过对 3d 菜单容器的每个子元素应用变换 但至少可以说 动画看起来很糟糕
  • 滑动返回手势颤动

    如何在颤振中实现从左侧滑动返回的手势 不确定它是否已经在 iOS 上自动实现 但我也希望在 Android 上也能实现 因为事情正在变得基于手势 Use CupertinoPageRoute使其在 Android 上运行 import pa
  • 如何从 C++ std::basic_ostream 派生并使 << 运算符虚拟?

    我正在编写一个具有各种消息输出的类 我想让这个类变得通用并且独立于平台 所以我正在考虑通过一个基本流引用它 它可以将所有消息转储到流中 通过这样做 如果该类在控制台程序中使用 我可以通过std cout并显示在控制台窗口中 或者我可以将派生
  • 仅在 Windows Chrome 上使用变换比例会导致文本模糊

    我遇到了一个关于 CSS 转换的非常令人沮丧的问题scale 我有一个文本块 我想在悬停时将其缩放 105 但它导致文本模糊 但仅限于 Windows 版本的 Chrome 我发现这个问题 https stackoverflow com q
  • onActivityResult 中的完成活动不起作用

    我有一对必须同生共死的活动 基本上 AlphaActivity 会做一些工作 然后发送一个意图 startActivityForResult 对于 Beta 活动 当 Beta 活动完成时 我希望它发送一个意图 startActivity
  • actionBar后退按钮和android后退按钮的区别

    actionBar后退按钮和android后退按钮有什么区别 因为看起来 ActionBar 后退按钮是通过以下方式调用的 ActionBar actionBar getSupportActionBar actionBar setDispl
  • std::vector 的复制构造函数如何运行?

    一个如何std vector
  • 如何将 UIView 从右上角设置动画/旋转 90 度?

    我花了几个小时试图找到一种方法来将 UIView 从右上角设置动画 旋转 90 度 效果几乎应该像屏幕顶部的旋转门一样 希望有人可以帮忙 因此 在我按下回车键后 我突然将两个和两个放在一起 并认为节拍器样本的工作方式有点像一扇旋转门 这让我
  • PHP - 按后退按钮时 Session_Destroy

    这是我的问题 我有一个名为login php 的登录页面 不包含HTML 代码 当用户正确输入其凭据时 他会被重定向到特定页面 在本例中我们将使用 test php 该页面上的唯一链接会注销当前会话 并将用户返回到index html 我的
  • Android 原生强指针 vs std::shared_ptr

    我指的是参考库 h https android googlesource com platform frameworks native jb dev include utils RefBase h 参考库 cpp https android

随机推荐

  • c++用vector实现定长队列

    目录 queue实现vector实现 我们可以用queue或vector实现定长队列 xff0c 但是如果我们有遍历定长队列的需求的话 xff0c 使用queue不是一个好的选择 xff0c 因为queue本身不支持直接访问元素 queue
  • c++判断文件是否存在

    可以使用C 43 43 的文件流来判断文件是否存在 以下是一个简单的函数 xff0c 可以通过文件名判断文件是否存在 xff1a span class token macro property span class token direct
  • 相机内外参数的意义

    1 内参数 xff1a 由于相机坐标系使用的是毫米制的单位 xff0c 而图像平面使用的像素为单位 内参数的作用就是在这两个坐标系之间进行线性的变化 相机光轴中心Z轴方向与像平面交点称为投影中心 xff0c 其坐标为 xff0c 其单位为像
  • C++实现读写分离的双缓冲buffer

    目录 1 双缓冲区 读写分离2 后台线程定时更新数据3 类设计完整代码cache cppcache hmain cppmakefile 读写分离的双缓冲buffer有以下好处 xff1a 提高了并发读写的效率 xff1a 在多线程环境下 x
  • 返回引用与返回值与返回std::move(obj)

    返回引用与返回值相比 返回引用与返回值相比有以下几个好处 xff1a 减少内存开销 xff1a 返回值需要在函数内部创建一个临时对象 xff0c 然后将该对象的副本返回给调用者 这个过程需要分配内存 复制数据等操作 xff0c 会增加内存开
  • error: non-member function ‘XXX::IsValid(const T&)’ cannot have cv-qualifier

    这个错误提示表明你定义的函数 IsValid 是一个非成员函数 xff0c 并且带有 const 限定符 在 C 43 43 中 xff0c 非成员函数不能带有 const 限定符 xff0c 因为它们没有隐式的 this 指针 xff0c
  • c++使用regex报错regex_error

    原本写了个同时识别IPv4和IPv6地址的C 43 43 函数 xff1a span class token macro property span class token directive hash span span class to
  • c++实现日志类(写入logfile)

    span class token macro property span class token directive hash span span class token directive keyword include span spa
  • c++中以类对象作为key用于unordered_map、map,以及std::tie技巧使用

    我有一个类 span class token keyword class span span class token class name UserRegion span span class token punctuation span
  • std::set_difference用法

    std set difference 是 C 43 43 STL 中的一个算法 xff0c 用于计算两个有序范围之间的差集 xff0c 并将结果存储到另一个有序范围中 std set difference 的函数签名如下 xff1a spa
  • __builtin_xxx指令学习【1】__builtin_expect

    builtin expect是GCC编译器提供的一个内置函数 xff0c 用于告诉编译器一个分支的执行概率 xff0c 以便编译器在生成机器码时进行优化 它的语法如下 xff1a span class token function buil
  • __builtin_xxx指令学习【2】__builtin_prefetch

    builtin prefetch是GCC编译器提供的一个内置函数 xff0c 用于预取数据到CPU的缓存中 xff0c 以便提高程序的执行效率 它的语法如下 xff1a builtin prefetch const void addr in
  • __builtin_xxx指令学习【3】__builtin_popcount & __builtin_popcountll

    builtin popcount是GCC和Clang编译器提供的一个内置函数 xff0c 用于计算一个整数中二进制位为1的个数 该函数的使用背景是在一些位运算和计算机视觉等领域中 xff0c 需要对二进制数据进行处理和分析 xff0c 而二
  • 当arduino遇到树莓派(usb串口)

    arduino与树莓派cm4通过usb串口连接 xff1a 问题描述 前两天尝试了很久arduino和树莓派连接 终于找到了连接的方法 xff01 可恶 这是在简书找到的过程 主要是先在树莓派端导serial包 pip install se
  • Linux的rc.local自启动服务

    Linux的rc local自启动服务 网址 xff1a http blog csdn net 21aspnet article details 6826659 Linux有自己一套完整的启动体系 xff0c 抓住了linux启动的脉络 x
  • __builtin_xxx指令学习【4】__builtin_clz&__builtin_ctz & __builtin_clzll & __builtin_ctzll

    builtin clz是GCC和Clang编译器提供的一个内置函数 xff0c 用于计算一个整数的二进制表示中 xff0c 从最高位开始连续的0的个数 该函数的使用背景是在一些位运算和计算机视觉等领域中 xff0c 需要对二进制数据进行处理
  • __builtin_xxx指令学习【5】__builtin_bswap16/32/64

    builtin bswap16 32 64是GCC和Clang编译器提供的内置函数 xff0c 用于交换一个整数的字节顺序 其中 xff0c builtin bswap16用于交换一个16位整数的字节顺序 xff0c builtin bsw
  • 【Python】@cache装饰器使用 (依赖cachetools)

    介绍 cachetools 是一个 Python 缓存库 xff0c 可以用于缓存函数的计算结果 xff0c 以提高程序的性能和响应速度 使用 cachetools 可以避免重复计算 减少网络请求 降低数据库负载等问题 xff0c 从而提高
  • Python常见装饰器使用(实用向)

    目录 1 96 64 staticmethod 96 2 96 64 classmethod 96 3 96 64 classmethod 96 与 96 64 staticmethod 96 比较4 96 64 property 96 5
  • 【C++】std::transform、std::back_inserter使用

    std transform函数可以用于对一个序列中的每个元素进行转换 xff0c 并将结果存储到另一个序列中 们需要传递三个参数 xff1a 源序列的起始迭代器 源序列的结束迭代器和目标序列的起始迭代器 此外 xff0c 我们还需要传递一个