2014-01-27 153 views
0

我在此格式的文件:make_pair矢量<矢量<struct>>

id1 its_vlaue1 id2 its_vlaue2 id3 its_vlaue3 
id4 its_vlaue4 id5 its_vlaue5 
id6 its_vlaue6 id7 its_vlaue7 id8 its_vlaue8 

其中id是整数,并且its_vlaue是浮动,例如:

100 0.1 2 0.6 9 0.03 
4 0.6 3 0.1 
. 
. 
until 300k line 

予读取此文件为:

struct dataf 
{ 
    int id; 
    float value; 
}; 
vector<vector<dataf>> mydata; 
dataf DF; 

void main() 
{ 

    ifstream inFile; 
    inFile.open("MyData.txt"); 
    if (inFile.fail()) 
     cout << "\n The file has been not found, please try again \n "; 
    else 
    { 
     string line; 
     cout << "\n File found!\n Reading the file data! \n\n"; 

     // Read the file until EOF 

     while (!inFile.eof()) 
     {   
      getline(inFile, line); 
      std::stringstream Sline(line); 

      while (Sline >> DF.id>> DF.value) 
      {    
       vector<dataf> temp; 
       temp.push_back(DF); 
       mydata.push_back(temp); 
      } 

     } 

    } 
    inFile.close(); 

    PairS(); 

    cout << " \nPress any key to continue\n"; 
    cin.ignore(); 
    cin.get(); 

    return; 
} 

对()函数make_pair使得:

(id1,id2), (id1,id3), (id2,id3) 
(id4,id5) 
(id6,id7), (id6,id8), (id7,id8) 

但是,我无法弄清楚

void PairS() 
    { 
     vector<dataf>::iterator i; 
     vector<dataf>::iterator j; 
      std::map<std::pair< int, int>, float> Pairf; 

     for (int k = 0; k != ((mydata.size()) - 1); ++k) 
     { 

     for (i = mydata[k].begin(); i != mydata[k].end(); ++i) 
     { 
      int a = (*i).Item; 

      for (j = mydata[k + 1].begin(); j != mydata[k+1].end(); ++j) 
      { 

       int b =(*j).Item; 
       auto itt = Pairf.find(std::make_pair(b, a)); 
       ++Pairf[(itt != Pairf.end()) ? std::make_pair(b, a) : std::make_pair(a, b)]; 

      } 

     } 
     } 

     cout << "\n\n The TotalSupp's Count for every Pair of Items :\n\n"; 
     for (const auto& p : Pairf) 
     { 
      std::cout << "(" << p.first.first << " " << p.first.second << ") = " 
       << p.second << '\n'; 
     } 

     cout << "\n"; 

} 

也,我不知道如果我选择存储在矢量我的数据的适当方法。

回答

1

对于第一部分(只是从文件中读取数据),我可能会做这样的事情:

struct dataf 
{ 
    int id; 
    float value; 

    friend std::istream &operator>>(std::istream &is, dataf &d) { 
     return is >> d.id >> d.value; 
    } 
}; 

// ... 

std::ifstream in("yourfile.dat"); 

// read data from file to vector 
std::vector<dataf> data{std::istream_iterator<dataf>(in), 
         std::istream_iterator<dataf>()}; 

至少如果我在读你的PairS正确,你似乎只想要独特项目。如果你需要保持原有的秩序

std::sort(data.begin(), data.end()); 
data.erase(std::unique(data.begin(), data.end()), data.end()); 

,您可以:如果你想要的(或至少不反对)中的数据进行排序的过程中,你可以多一点轻松地删除重复这样的做这样的事情:

std::unordered_set unique; 
std::vector<dataf> data; 

std::copy_if(std::istream_iterator<dataf>(in), 
      std::istream_iterator<dataf>, 
      std::back_inserter(data), 
      [&](dataf const &d) { return unique.insert(d).second; }); 

这里的基本想法是,为每个项目被读取,它会尝试该项目插入unordered_set。如果成功,我们复制向量,这表明它以前没有被看到。

+0

非常感谢。第一部分工作,但我有问题:当你从文件读取数据时,代表所有数据?和()意味着直到文件结束? – NHA

+0

第二部分,给了我的错误,所以我没有测试它,即使我插入(#包括 的#include 的#include 的#include ) – NHA

+0

的第二部分,我想make_pair与(id1,id2),(id1,id3),(id2,id3)中的所有项目并计算它们的频率,并对第二行进行相同处理:(id4 ,id5),如果一个线对存在,我不会创建对,而是更新其频率。我想我会立即尝试从文件中做到这一点,而不是先将数据放入向量中 – NHA

相关问题