Guest User

istream_itreator

a guest
May 20th, 2016
163
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.43 KB | None | 0 0
  1. #include <iostream>
  2. #include <list>
  3. #include <fstream>
  4. #include <algorithm>
  5. #include <iterator>
  6. #include "merge_sort.h"
  7. using namespace std;
  8. void incr(istream_iterator<int> file_iter)
  9. {
  10.     cout << *++(++file_iter) << endl;
  11. }
  12. void merge_sort(istream_iterator<int>& file_iter, istream_iterator<int>& end_of_stream)
  13. {
  14.     size_t size = distance(file_iter, end_of_stream);
  15.     if (size > 1)
  16.     {
  17.         istream_iterator<int> it(file_iter);
  18.         advance(it, size / 2);
  19.         size_t const left_size = size / 2;
  20.         size_t const right_size = size - left_size;
  21.  
  22.         merge_sort(file_iter, it);
  23.         merge_sort(++it, end_of_stream);
  24.  
  25.         size_t lidx = 0, ridx = left_size, idx = 0;
  26.         istream_iterator<int> itl(file_iter); // pointer to left element
  27.         advance(itl, lidx);
  28.         istream_iterator<int> itr(file_iter); // pointer to right element
  29.         advance(itr, ridx);
  30.         istream_iterator<int> itls(file_iter); // pointer to border element
  31.         advance(itls, left_size);
  32.         int* tmp_array = new int[size];
  33.  
  34.         while (lidx < left_size || ridx < size)
  35.         {
  36.             if (*itl < *itr)
  37.             {
  38.                 tmp_array[idx++] = move(*itl);
  39.                 lidx++;
  40.             }
  41.             else
  42.             {
  43.                 tmp_array[idx++] = move(*itr);
  44.                 ridx++;
  45.             }
  46.  
  47.             if (lidx == left_size)
  48.             {
  49.                 copy(itr,
  50.                     end_of_stream,
  51.                     &tmp_array[idx]);
  52.                 break;
  53.             }
  54.             if (ridx == size)
  55.             {
  56.                 copy(itl,
  57.                     itls,
  58.                     &tmp_array[idx]);
  59.                 break;
  60.             }
  61.         }
  62.         ofstream fo("forsort.dat");
  63.         ostream_iterator<int> ositer(fo, "\n");
  64.         copy(make_move_iterator(tmp_array), make_move_iterator(&tmp_array[size]), ositer);
  65.     }
  66. }
  67.  
  68. int main()
  69. {
  70.     ifstream fi("forsort.dat");
  71.  
  72.     // read data from file
  73.     istream_iterator<int> file_iter(fi);
  74.     istream_iterator<int> end_of_stream;
  75.    
  76.     //fstream out("forsort.dat", fstream::out);
  77.    
  78.     /*
  79.     auto it = file_iter;
  80.     for (int k = 0; k < 8; it++, k++)
  81.         cout << *(it) << "\n";
  82.     */
  83.     //cout << *file_iter << endl << *(++file_iter) << endl << *file_iter << endl;
  84.     size_t size = distance(file_iter, end_of_stream);
  85.     cout << size << endl;
  86.     incr(file_iter);
  87.     //merge_sort(file_iter, end_of_stream);
  88.    
  89.     /*
  90.     list<int> l;
  91.     l.push_back(5);
  92.     l.push_back(5);
  93.     l.push_back(5);
  94.     copy(l.begin(), l.end(), ositer);
  95.    
  96.     cout << *file_iter << " dist = " << distance(file_iter, end_of_stream) << endl;
  97.     copy(file_iter, end_of_stream, back_inserter(i));
  98.  
  99.     cout << endl;
  100.  
  101.     ostream_iterator<int> ositer(cout, " - ");
  102.     copy(i.begin(), i.end(), ositer);
  103.     cout << endl;
  104.     */
  105.     system("PAUSE");
  106.     return 0;
  107. }
Add Comment
Please, Sign In to add comment