1: #include <algorithm> 
   2: #include <vector> 
   3: 
   4: 
   5: 
   6: /**
   7: * Demonstrates a fast way to find out the differences of two containers.
   8: * Is very useful when lage datasets have to be compared. The std::set_difference function
   9: * compares two sorted containers. Since the elements in the container are sorted not each
  10: * element of one container has to be compared with each element of the other container
  11: * and the other way round ! This results in a very fast way of comparing ( synchronizing ? )
  12: * large datasets.
  13: */
  15: 
  16: // -----------------------------------------------------------
  17: // For sorting the vector !!
  18: // -----------------------------------------------------------
  19: struct comp
  20: {
  21:   bool operator()( const unsigned int i1, const unsigned int i2 ) const
  22:   {
  23:     return i1 < i2;
  24:   }
  25: };
  26: 
  27: 
  28: // -----------------------------------------------------------
  29: // void Synchronize(): to test the std::set_difference function
  30: // -----------------------------------------------------------  
  31: void Synchronize()
  32: {
  33: std::vector<unsigned int> vec_master;
  34: std::vector<unsigned int> vec_slave;
  35: std::vector<unsigned int> vec_transfer;
  36: std::vector<unsigned int> vec_delete;
  37: 
  38: std::vector<unsigned int>::const_iterator const_iter;
  39: 
  40: vec_master.push_back(7);
  41: vec_master.push_back(2);
  42: vec_master.push_back(1);
  43: vec_master.push_back(4);
  44: vec_master.push_back(5);
  45: vec_master.push_back(3);
  46: vec_master.push_back(6);
  47: 
  48: vec_slave.push_back(9);
  49: vec_slave.push_back(3);
  50: vec_slave.push_back(1);
  51: vec_slave.push_back(4);
  52: vec_slave.push_back(5);
  53: 
  54: cerr << "\n\nContents of master: " << endl;
  55: 
  56: for ( const_iter = vec_master.begin(); const_iter != vec_master.end(); ++const_iter )
  57:     {
  58:     cerr << *const_iter << " ";
  59:     }
  60: 
  61: cerr << "\n\nContents of slave:  " << endl;
  62: 
  63: for ( const_iter = vec_slave.begin(); const_iter != vec_slave.end(); ++const_iter )
  64:     {
  65:     cerr << *const_iter << " ";
  66:     }
  67: 
  68: std::sort( vec_master.begin(), vec_master.end(), comp() );
  69: std::sort( vec_slave.begin(), vec_slave.end() );
  70: 
  71: cerr << "\n\n\nAFTER SORT:\n" << endl;
  72: 
  73: cerr << "Contents of master: " << endl;
  74: 
  75: for ( const_iter = vec_master.begin(); const_iter != vec_master.end(); ++const_iter )
  76:     {
  77:     cerr << *const_iter << " ";
  78:     }
  79: 
  80: cerr << "\nContents of slave:  " << endl;
  81: 
  82: for ( const_iter = vec_slave.begin(); const_iter != vec_slave.end(); ++const_iter )
  83:     {
  84:     cerr << *const_iter << " ";
  85:     }
  86: 
  87: cerr << "\n\n\nNumbers NOT on the slave:" << endl;
  88: 
  89: insert_iterator< vector<unsigned int> > ii( vec_transfer, vec_transfer.begin() );
  90: std::set_difference( vec_master.begin(), vec_master.end(), vec_slave.begin(), vec_slave.end(), ii );
  91: 
  92: for ( const_iter = vec_transfer.begin(); const_iter != vec_transfer.end(); ++const_iter )
  93:     {
  94:     cerr << *const_iter << " ";
  95:     }
  96: 
  97: cerr << "\nNumbers NOT on the master:" << endl;
  98: 
  99: //std::set_difference( vec_slave.begin(), vec_slave.end(), vec_master.begin(), vec_master.end(), vec_delete.begin() );
 100: std::set_difference( vec_slave.begin(), vec_slave.end(), vec_master.begin(), vec_master.end(), ostream_iterator<unsigned int>(cout, " " ));
 101: cout << endl;
 102: 
 103: cerr << endl;    
 104: 
 105: }
 106: 
 107: 
 108: // -----------------------------------------------------------
 109: // 
 110: // -----------------------------------------------------------  
 111: int main ( void )
 112: {
 113: Synchronize();
 114: 
 115: return 0;
 116: }
 117: