2014-01-27 5 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 

где идентификатор целое число, и 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; 
} 

Pairs() функция 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. Скопируем if на вектор iff, который преуспевает, что указывает на то, что он не был замечен ранее.

+0

Большое спасибо. первая часть работает, но у меня есть вопрос: код, который, когда вы читаете данные из файла, означает все данные? и() означает до конца файла? – NHA

+0

вторая часть, дал мне ошибки, поэтому я не испытывал, даже после того, как я ввожу (#include #include #include #include ) – NHA

+0

для второй части, я хочу make_pair с элементов в векторе, так что все элементы в первой строке будут: (id1, id2), (id1, id3), (id2, id3) и подсчитывать их частоты, и делают то же самое для второй строки: (id4 , id5), если пара существует в строке, я не буду создавать пару вместо этого, я буду обновлять ее частоту. Я думаю, я попытаюсь сделать это из файла сразу, вместо того, чтобы сначала поместить мои данные в вектор – NHA

Смежные вопросы