如何迭代到较小的容器(即步幅!= 1)

2024-01-10

有一个问题在精神上很相似here https://stackoverflow.com/questions/2476425/c-stl-stdtransform-with-given-stride。不幸的是,这个问题没有引起太多回应 - 我想我会问一个更具体的问题,希望可以建议替代方法。

我正在将二进制文件写入std::cin (with tar --to-command=./myprog)。 二进制文件恰好是一组浮点数,我想将数据放入std::vector<float>- 最好是 C++ 方式。

我可以生成一个std::vector<char>非常好(感谢这个答案 https://stackoverflow.com/questions/5420317/c-reading-and-writing-binary-file/5420568#5420568)

#include <fstream>
#include <iostream>
#include <iterator>
#include <algorithm>
#include <vector>

int
main  (int ac, char **av)
{
  std::istream& input = std::cin;
  std::vector<char> buffer;
  std::copy( 
        std::istreambuf_iterator<char>(input), 
           std::istreambuf_iterator<char>( ),
           std::back_inserter(buffer)); // copies all data into buffer
}

我现在想改变我的std::vector<char> into a std::vector<float>,大概与std::transform和一个执行转换的函数(achar[2] to a float, 说)。然而我正在挣扎,因为我的std::vector<float>将有一半的元素std::vector<char>。如果我可以以 2 的步幅进行迭代,那么我想我会很好,但从上一个问题来看,我似乎无法做到这一点(至少不能优雅地做到)。


我会编写自己的类来读取两个字符并将其转换为浮点数。

struct FloatConverter
{
    // When the FloatConverter object is assigned to a float value
    // i.e. When put into the vector<float> this method will be called
    //      to convert the object into a float.
    operator float() { return 1.0; /* How you convert the 2 chars */ }

    friend std::istream& operator>>(std::istream& st, FloatConverter& fc)
    {
        // You were not exactly clear on what should be read in.
        // So I went pedantic and made sure we just read 2 characters.
        fc.data[0] = str.get();
        fc.data[1] = str.get();
        retun str;
    }
    char   data[2];
 };

根据 GMan 的评论:

struct FloatConverterFromBinary
{
    // When the FloatConverterFromBinary object is assigned to a float value
    // i.e. When put into the vector<float> this method will be called
    //      to convert the object into a float.
    operator float() { return data }

    friend std::istream& operator>>(std::istream& st, FloatConverterFromBinary& fc)
    {
        // Use reinterpret_cast to emphasis how dangerous and unportable this is.
        str.read(reinterpret_cast<char*>(&fc.data), sizeof(float));
        retun str;
    }

    float  data;
};

然后像这样使用它:

int main  (int ac, char **av)
{
  std::istream& input = std::cin;
  std::vector<float> buffer;

  // Note: Because the FloatConverter does not drop whitespace while reading
  //       You can potentially use std::istream_iterator<>
  //
  std::copy( 
           std::istreambuf_iterator<FloatConverter>(input), 
           std::istreambuf_iterator<FloatConverter>( ),
           std::back_inserter(buffer));
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何迭代到较小的容器(即步幅!= 1) 的相关文章

随机推荐

  • 如何使用 iOS 应用程序在 iPad/iPhone 中打开 PDF 文件?

    如何使用我自己的应用程序打开存储在 iPad iPhone 中的 PDF 文件 您可以使用 UIwebview 来加载它 这很简单 如果您想要更大的灵活性 您应该使用 Quartz 框架类 EDIT 要查看下载的 PDF 您可以在应用程序中
  • SubSonic 3 和 MySQL,在 CleanUp() 方法中从列名中删除下划线会导致在 linq-query 中使用属性时出现异常

    我在使用 SubSonic 3 0 0 3 ActiveRecord 和 MySQL 时遇到了问题 由于 MySQL 不允许您在表名或列名中使用大写字母 或者如果您这样做 则忽略它 我决定使用下划线分隔单词 例如entity id 然后使用
  • 如何将一个数字分成n组

    我需要将一个数字分成几组数字 然后将这些数字放入一个数组中 然后我将对这些数字进行一些简单的数学运算 然后将它们插入到文本框中 到目前为止 我只找到了如何将数字拆分为单独的数字 如下所示 var number 12354987 output
  • python Fabric是否支持动态设置env.hosts?

    我想动态更改 env hosts 因为有时我想先部署到一台机器 检查是否正常 然后部署到多台机器 目前我需要先设置 env hosts 如何在方法中设置 env hosts 而不是在脚本启动时全局设置 是的 你可以设置env hosts动态
  • MySQL > 表不存在。但它确实(或者应该)

    我更改了 MySQL 安装的数据目录 除了一个之外 所有库都正确移动 我可以连接并且USE数据库 SHOW TABLES还正确返回所有表 并且每个表的文件都存在于 MySQL 数据目录中 然而 当我尝试SELECT表中的某些内容 我收到一条
  • 内存分配问题

    这个问题是在面试的笔试中被问到的 include
  • 使用 FileProvider 从图库中选取图像文件

    编译 Android N 我遇到了一个问题FileProvider 我需要让用户从图库中选择图像 用相机拍照 然后将其裁剪为正方形 我已经成功实现了FileProvider用于用相机拍摄图像 但我在从图库中选取图像时遇到严重问题 问题是 在
  • 线段树、区间树、二叉索引树和范围树有什么区别?

    线段树 区间树 二叉索引树和范围树之间有什么区别 关键思想 定义 应用领域 更高维度的性能 秩序 空间消耗 请不要仅仅给出定义 所有这些数据结构都用于解决不同的问题 线段树存储间隔 并针对 这些区间中的哪一个包含给定点 查询 区间树也存储间
  • 配置 Rails 以输出 HTML 输出而不是 XHTML

    使用助手 表单 javascript css 等 时 如何配置 Ruby on Rails 输出标准 HTML 代码而不是 XHTML I don t想要在末尾有斜线
  • 如何压缩两个不同大小的列表,重复较短的列表?

    我想压缩两个不同长度的列表 例如 A 1 2 3 4 5 6 7 8 9 B A B C 我期待这个 1 A 2 B 3 C 4 A 5 B 6 C 7 A 8 B 9 C 但内置的zip不会重复与较大尺寸的列表配对 是否存在任何内置方法可
  • 如何动态更改引导模式数据目标点击

    我有一个网站日历 其作用类似于预订请求 我在 Bootstrap 2x 中可以使用此功能 但已将应用程序转换为 3 0 一切似乎都正常 但我试图找出如何动态更改数据目标 如果日期可用 日历中的一天可能如下所示 div class NotRe
  • 我应该使用 YUI 压缩机还是新的 Google Closure 编译器来压缩 JavaScript?

    YUI Compressor 是公认的最佳最小化工具 但 Closure 似乎还可以更好 无论你找到最适合你的那个 我认为这是目前的普遍答案 YUI 已经推出了更长的时间 因此毫无疑问将是目前公认的最佳工具 然而 Closure 对我们来说
  • 如何让 gvim 与 Visual Studio 2010 完美配合?

    在我的上一份工作中 他们使用 Visual Studio 2005 有时也使用 Visual Studio 97 为了方便使用命令行 我使用 vim 来编辑 Mercurial 版本控制配置文件 如 hgrc 和 hgignore 然而 我
  • 更改 HTML POST 端口

    我在 HTML 文档中有一个表单 我想将其内容作为 POST 请求提交到服务器 但是 我想将 POST 请求发送到服务器上除端口 80 之外的端口 这可能吗 只需将其附加到操作中即可
  • 5xx 或 4xx 错误,“不存在‘Access-Control-Allow-Origin’标头”

    我的浏览器在 devtools 控制台中记录以下消息 请求的资源上不存在 Access Control Allow Origin 标头 响应的 HTTP 状态代码为 503 背景 我有两个应用程序 一种是连接到 Mongo 数据库的 Exp
  • Android模拟低数据信号强度

    我在使用某个应用程序时遇到了一些问题 我们的用户抱怨在信号强度较低的情况下 他们在使用该应用程序时遇到了问题 有什么办法可以在模拟器上模拟这个吗 Thanks Teja 我知道在 DDMS 的 模拟器控制 选项卡中 顶部有一个部分 您可以在
  • 使用经过训练的分类器进行 NLTK 分类接口

    我找到了一小块代码here http streamhacker com 2010 05 10 text classification sentiment analysis naive bayes classifier import nltk
  • 扩展 jQuery 核心的用处

    我发现了一种扩展核心 jQuery init 函数的方法 每当您使用 或 jQuery 函数时都会调用该函数 使用普通代理模式不可能做到这一点 但以下代码可以使其工作 var origInit jQuery fn init jQuery f
  • DB2级联删除命令?

    是否有特殊的语法来在 DB2 上执行级联删除 或者是否只能通过使用 ON DELETE CASCADE 选项定义它们来创建 可级联 表 我想要实现的是 当我删除该键时 删除基于相同外键的其他表行 但这是在已经存在且填充数据的数据库上完成的
  • 如何迭代到较小的容器(即步幅!= 1)

    有一个问题在精神上很相似here https stackoverflow com questions 2476425 c stl stdtransform with given stride 不幸的是 这个问题没有引起太多回应 我想我会问一