序列化浮点数向量

时间:2013-04-01 06:08:49

标签: c++ boost xcode4 stdvector

问题是我想在文件中保存float的2D向量。因为我不熟悉C ++,它变得很麻烦,可能的解决方法是:

  1. 将它们序列化为字符串并写入文件。
  2. 将它们序列化为二进制数据并写入文件。
  3. 两种方法中哪一种在速度方面更有效?

    我正在做类似的事情:

    std::string serialized;
    
        for (int s = 0; s < (int) mfcc_features_a.size(); s++)
         {
    
         for (int t = 0; t < (int) mfcc_features_a[s].size(); t++){
           serialized = serialized + "|" + boost::lexical_cast<std::string>(mfcc_features_a[s][t]);
         }
         }
    
        std::cout << "serialized string is: " << serialized << std::endl;
    

3 个答案:

答案 0 :(得分:2)

存储二进制数据可能会更快,因为数据几乎肯定会更小。差异可能对您的计划的整体表现有重要影响,也可能没有影响:您必须进行衡量才能找到答案。

在C ++ 03中,代码中存在严重的低效率。 specialized = specialized + "|" + ...逐渐创建完整数据的更长和更长的副本,每个浮点值三个副本。使用+=,或直接将数据写入流。在C ++ 11中,您可以通过编写specialized = std::move(specialized) + "|" + ...

来解决它

答案 1 :(得分:1)

虽然二进制文件肯定会更快执行,但编码和调试会很麻烦,因为大多数程序员都很难理解浮点格式。在这方面,编程和执行的整体时间可能会更慢。

此外,如果需要将数据移植到任何其他机器,几乎可以肯定,转换为通用可读格式是值得的。

答案 2 :(得分:0)

虽然不是很C ++',但我喜欢使用sprintf例程将浮点值格式化为固定宽度的字符串(24个字符)。

char *pData = new char[vec.size() * 24 + 1];
char *p = pData;
for (size_t i = 0; i < vec.size(); ++i, p += 24)
    sprintf(p, "%+.14E\r\n", vec(i));


// ... write pData to file ...

delete[] pData;
祝你好运!