c++ - 如何将自定义数据类型(std::array 填充 std::pairs)写入文件流

标签 c++

我是 c++ 的新手,我正在构建一个模型来研究基因中的某些突变。我的“基因”被定义为两个 double a 和 b 的函数。单个基因以 std::pair 格式保存。整个基因组由收集在 std:array 中的四个这些基因组成。

我对基因进行了一些更改,并想将信息写入文本文件以供分析。我目前实现它的方式很乏味。我有单独的函数(总共 8 个),它们为数组中的每个 i 收集 g[i].first、g[i[.second 等信息。我觉得这可以更有效地完成。

相关代码:

数据类型声明:

using gene = std::pair<double, double>;
using genome = std::array<gene, 4>;

我在其中创建一个名为 g 的基因组的函数:

genome Individual::init_Individual()
{
    double a1, a2, a3, a4 = -1.0;
    double b1, b2, b3, b4 = 0.0;
    gene g1{ a1,b1 };
    gene g2{ a2,b2 };
    gene g3{ a3,b3 };
    gene g4{ a4,b4 };
    genome g{g1,g2,g3,g4};
    return g;
}

收集函数示例:

double get_Genome_a1() { return g[0].first; };

将信息写入文本文件的函数:

void Individual::write_Statistics(unsigned int &counter)
{
    //Generate output file stream
    std::ofstream ofs;
    ofs.open("data.txt", std::ofstream::out | std::ofstream::app);    
    ofs << counter << std::setw(14) << get_Genome_a1() <<     std::setw(14)
        << get_Genome_a2() << std::setw(14) << get_Genome_b1() <<
        std::setw(14) << get_Genome_b2() << "\n";
}
ofs.close();

等等等等 所以我的数据文件在这个例子中的最终结果是这样的:

1 a1 a2 b1 b2

2 a1 a2 b1 b2

3 a1 a2 b1 b2

等等等等

我的问题:

  1. 我目前将两个 double 存储在一个 std::pair 中,我将其收集在一个 std::array 中。这是一种有效的存储机制还是可以改进?
  2. 有没有一种方法可以直接引用我的自定义数据类型“基因组”中的单个元素,只使用一个函数以与我现在完全相同的方式写掉每个元素(每个元素之间有 14 个空格)?伪代码中的内容如:get_Genome() {return g;};,当你调用它时,你可以指定如下元素:get_Genome([0].first) 这将是存储在数组的第一对中的第一个值,例如。

快乐学习,任何见解都会受到赞赏。

最佳答案

你的存储很好。 pairarray 都不需要间接/动态分配,因此这非常适合缓存局部性。

至于引用元素,不,不完全是那样。您可以拥有一个包含成员 FIRSTSECOND 的枚举,然后将其作为另一个参数传递给 get_Genome。但是,老实说,这在我看来并不值得。

总的来说,我觉得你的方法很棒。我唯一的建议是:

重复使用一个ofstream

…而不是为每个样本打开和关闭文件。您应该会看到该更改带来的显着速度提升。

你可以在你的 main 或其他地方创建一个,并让 write_Statistics 接受一个 std::ostream&,这也会更灵活!

初始化快一点

init_Individual 中的所有声明可能 都得到优化,但为什么要冒这个险呢?以下是非常有表现力的:

genome Individual::init_Individual()
{
    const double a = -1.0;
    const double b =  0.0;

    return {{a, b}, {a, b}, {a, b}, {a, b}};
}

这里值得注意的是,您的double 初始化是错误的:您只初始化了a4b4;你的编译器应该已经警告过你了。但是,如图所示,我们并不需要所有这些,因为它们 [旨在] 具有相同的值!

关于c++ - 如何将自定义数据类型(std::array 填充 std::pairs)写入文件流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54162258/

相关文章:

c++ - 如何将 std::bind 与标准库一起使用并保存返回类型?

c++ - 使用之前在 if 语句中定义的变量

c++ - 如何使用 VC++ 编译器标志指定枚举大小

c++ - 具有 C++ 数据结构的 C 代码

Windows 和 Linux 之间的 C++ 可移植性

c++ - 确定不安全转换的警告 clang

C++ Opengl 渲染图像的一部分

c++ - 使用剪刀库的线和多边形之间的交点

c++ - 通过 USB 入口和 C++ 与 Blackstar ID Core 吉他放大器通信

C++ 创建对象数组(来自不同类)