【问题标题】:Passing a function a string向函数传递字符串
【发布时间】:2017-04-29 01:32:35
【问题描述】:

我目前有一个程序,它从 dat 文件中获取数据并形成一个二维向量。现在,我有 10 个 dat 文件和 10 个不同的函数,每个函数都创建一个向量。我想知道如何缩短代码并创建一个函数,通过传递带有 dat 文件名称的字符串来创建二维向量。下面我列出了几个函数。

vector<vector<double> > Cosmic_ray_events()  
{
const double columns = 8.;
ifstream cosmic_ray_data("events_comp-h4a_10.00-10000.00PeV_zen37.00.dat", ios::in);
vector< vector<double> > cosmic_ray;

while(cosmic_ray_data.good())     
{
    vector <double> row_vector;
    for(int i = 0; i < columns; i++)
    {
        double data;
        cosmic_ray_data >> data;
        row_vector.push_back(data);
    }
    cosmic_ray.push_back(row_vector);
    //cout << cosmic_ray[i][data];
}
cosmic_ray_data.close();

for(double k = 0; k < cosmic_ray.size(); k++)
{
    for (double z = 0; z < cosmic_ray[k].size(); z++)
    {
        cout << cosmic_ray[k][z] << "  " << endl;       
    }
}

return(cosmic_ray);
}

vector<vector<double> > IC40_events()  
{
const double columns = 8.;
     ifstream IC40_events_data("IC40_exp.dat", ios::in);
     vector< vector<double> > IC40;

    while(IC40_events_data.good())
   {
      vector <double> row_vector1;
    for (int j = 0; j < columns; j++)
    {
        double IC40_data;
        IC40_events_data >> IC40_data;
        row_vector1.push_back(IC40_data);
    }
    IC40.push_back(row_vector1);
}
IC40_events_data.close();

return(IC40);

} 代码在这里

【问题讨论】:

    标签: c++ function vector


    【解决方案1】:

    基本上你这样做

    std::vector<std::vector<double> > readDAT(std::string const &path)
    {
       std::vector<std::vector<double> > data;
    
       const int columns = 8;  // pass as a parameter?
       ifstream instream(path, ios::in);
    
       while( data_good(instream) ) // you don't provide cosmic_data_good
       {
          std::vector<double> line;
          for(int i= 0; i < columns; i++)
          {
             double datum;
             instream >> datum;
             line.push_back(datum);
          }
          data.push_back(line);
       }
    
       return data;
    } 
    

    这些文件由 8 个实数列组成。所以他们都可以用相同的程序来阅读。如果列数不同,您可以将其传入并使列成为变量而不是常量,这只是一个小改动。您还需要某种检测数据结束的方法,我想 data_good() 函数会这样做。

    另一个技巧是获取打开的 istream,并在包装​​函数中打开文件。然后,您可以从任何来源加载 .DAT 数据,而不仅仅是磁盘文件。

    这样称呼

     vector<vector<double> > cosmic_ray = readDAT("events_comp-h4a_10.00-10000.00PeV_zen37.00.dat");
     vector<vector<double> > IC40_events = readDAT("IC40_exp.dat");
    

    等等,对于您的所有数据集。

    【讨论】:

    • 如何检查它是否会读取并创建所有必要的二维向量?
    • 这就是你的 is_good() 函数。假设您发布的代码是正确的,它会在数据用完时返回 false。 (使用 C 接口进行流处理要容易得多,但这是另一个话题)。
    • 谢谢,我仍然无法理解这段代码将如何调用 10 个不同的 dat 文件并生成所有必要的向量。
    猜你喜欢
    • 2017-05-02
    • 2017-04-18
    • 1970-01-01
    • 1970-01-01
    • 2011-05-12
    • 2016-01-28
    • 2013-12-11
    • 1970-01-01
    相关资源
    最近更新 更多