C++ 将大量向量转换为字符向量的最有效方法

Posted

技术标签:

【中文标题】C++ 将大量向量转换为字符向量的最有效方法【英文标题】:C++ most efficient way to cast a very large number of vectors doubles to vectors of chars 【发布时间】:2014-09-29 17:48:41 【问题描述】:

我有一些代码可以进行一些计算,然后返回很多(数千甚至数十万)vectorsvectorsdoubles(矩阵)。这些值已经四舍五入到最接近的整数,并且永远不会超过一个字节的最大大小。矩阵将被展平为一维vectors,然后作为二进制数据写入文件。但是,我不想将这些值存储为doubles,因为它们会占用更多空间。它们需要存储为chars,但返回它们的代码总是会给我双打,所以我想知道将所有doubles 转换为chars 的最快方法是什么。

我正在寻找一种将vectors 的一种类型转换为另一种类型的方法,因为向量很容易写入文件。

【问题讨论】:

这些值有签名吗? 向量是连续存储的。 double 比 char 有更多的空间。您不能将vector<double> 就地转换为vector<char> 您最好的选择可能是提前将您的向量简单地返回为vector<char>。无论哪种方式,您都需要进行一些复制。 @Cameron 是的,他们已签名。 @AndyG 是的,我知道这一点。不能真正更改返回doubles 的代码,因为它被许多其他期望doubles 的方法使用。或许我应该写一个charversion 的方法? 双打的允许范围是多少?是 0 到 256 吗?还是 -128 到 127?还是什么? 【参考方案1】:

你试过std::copystd::transform吗?似乎它应该非常简单。

【讨论】:

【参考方案2】:

我最终编写了计算中最后一个方法的char 版本。比复制或做更复杂的事情更容易。

【讨论】:

【参考方案3】:

您可以在此模式下毫无问题地投射矢量:

const char* VectToChar = (char*)&Vector[0];

在以下代码中,您可以找到一个完整的示例。警告此代码仅对矢量数据读取有效,对写入无效!

#include <stdio.h>
#include <vector>

using namespace std;

 int _tmain(int argc, _TCHAR* argv[])


    vector<double> Vector;

    Vector.push_back(10.2);
    Vector.push_back(15.2);


    // You can use this method only for data reading, no writing!!
    const char* VectToChar = (char*)&Vector[0];


    // Test
    double d0 = *((double*)VectToChar);
    double d1 = *((double*)(VectToChar+sizeof(double)));
    printf("%f, %f", d0, d1);

    return 0;

【讨论】:

以上是关于C++ 将大量向量转换为字符向量的最有效方法的主要内容,如果未能解决你的问题,请参考以下文章

将数组转换为向量的最简单方法是啥?

将数组转换为向量的最简单方法是啥?

如何将向量转换为特定类型的字符串

在 C++ 中将字符串转换为向量

在插入向量 C++ 之前验证用户输入

在 C++ 中将 matlab 矩阵转换为数组的有效方法