Use set_union to union two lists : union « Set Multiset « C++






Use set_union to union two lists

  
#include <algorithm>
#include <functional>
#include <iomanip>
#include <iostream>
#include <list>
#include <string>
#include <vector>

using namespace std;

class PC
{
   public:
   enum part { keyboard, mouse, monitor };

   PC( part a_part = PC::keyboard, int id = 0 );
   bool operator<( const PC& rhs ) const;

   void print() const;

   private:
   part part_;
   int id_;
};

inline
PC::PC( part a_part, int id ) : part_( a_part ), id_( id ){}

inline bool PC::operator<( const PC& rhs ) const{  
   return id_ < rhs.id_; 
}

void PC::print() const {
   string component;
   if( part_ == keyboard )
      component = "keyboard";
   else if( part_ == mouse )
      component = "mouse";
   else
      component = "monitor";

   cout << "ID: " << setw( 8 ) << left << id_ << " PC: " << component << endl;
}

int main( )
{
   list<PC> listA;
   listA.push_back( PC( PC::keyboard, 3 ) );
   listA.push_back( PC( PC::mouse, 1 ) );
   listA.push_back( PC( PC::monitor, 9 ) );
   listA.push_back( PC( PC::keyboard, 2 ) );
   listA.push_back( PC( PC::monitor, 8 ) );

   list<PC> inspector_B( listA );
   inspector_B.front() = PC( PC::mouse, 6 );
   inspector_B.back() = PC( PC::monitor, 1 );

   // must sort before using set algorithms
   listA.sort();
   inspector_B.sort();

   for_each( listA.begin(), listA.end(),mem_fun_ref( &PC::print ) );
   for_each( inspector_B.begin(), inspector_B.end(),mem_fun_ref( &PC::print ) );

   vector<PC> result;
   // make vector large enough to hold all inspected parts
   result.resize( listA.size() + inspector_B.size() );

   vector<PC>::iterator the_end = set_union( listA.begin(), listA.end(),inspector_B.begin(), inspector_B.end(), result.begin() );
   for_each( result.begin(), the_end, mem_fun_ref( &PC::print ) );

}
  
    
  








Related examples in the same category

1.Union two sets
2.Create the union of two lists
3.disjoint() algorithm: if they contain no elements in common