gpt4 book ai didi

c++ - 如何迭代到更小的容器中(即步幅!= 1)

转载 作者:太空狗 更新时间:2023-10-29 20:47:31 26 4
gpt4 key购买 nike

有个问题很神似here .不幸的是,这个问题并没有引起太多回应——我想我会问一个更具体的问题,希望可以建议一种替代方法。

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

我可以生成 std::vector<char>非常好(感谢 this answer )

#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>进入 std::vector<float> , 大概是 std::transform和一个进行转换的函数(例如,char[2]float)。然而,我正在挣扎,因为我的 std::vector<float>元素数量将是 std::vector<char> 的一半.如果我可以以 2 的步幅进行迭代,那么我认为我会很好,但从上一个问题看来我不能那样做(至少不能优雅地做到)。

最佳答案

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

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

关于c++ - 如何迭代到更小的容器中(即步幅!= 1),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5424093/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com