C++/Set Multiset/union

Материал из C\C++ эксперт
Перейти к: навигация, поиск

Create the union of two lists

<source lang="cpp">

  1. include <iostream>
  2. include <list>
  3. include <algorithm>

using namespace std; template<class InIter> void show_range(const char *msg, InIter start, InIter end); int main() {

 list<char> list1, list2, result(15);
 list<char>::iterator res_end;
 for(int i=0; i < 5; i++) {
    list1.push_back("A"+i);
 }   
 for(int i=3; i < 10; i++) {
    list2.push_back("A"+i);
 }
 show_range("Contents of list1: ", list1.begin(), list1.end());
 show_range("Contents of list2: ", list2.begin(), list2.end());
 res_end = set_union(list1.begin(), list1.end(),list2.begin(), list2.end(),result.begin());
 show_range("Union of list1 and list2: ", result.begin(), res_end);
 return 0;

} template<class InIter> void show_range(const char *msg, InIter start, InIter end) {

 InIter itr;
 cout << msg << endl;
 for(itr = start; itr != end; ++itr)
   cout << *itr << endl;

}


 </source>


disjoint() algorithm: if they contain no elements in common

<source lang="cpp">

  1. include <iostream>
  2. include <list>
  3. include <algorithm>

using namespace std; template<class InIter> bool disjoint(InIter start, InIter end,InIter start2, InIter end2); int main(){

 list<char> list1, list2, list3;
 for(int i=0; i < 5; i++) 
    list1.push_back("A"+i);
 for(int i=6; i < 10; i++) 
    list2.push_back("A"+i);
 for(int i=8; i < 12; i++) 
    list3.push_back("A"+i);
 if(disjoint(list1.begin(), list1.end(), list2.begin(), list2.end()))
    cout << "list1 and list2 are disjoint\n";
 else 
    cout << "list1 and list2 are not disjoint.\n";
 return 0;

} template<class InIter> bool disjoint(InIter start, InIter end,InIter start2, InIter end2) {

 InIter itr;
 for( ; start != end; ++start)
   for(itr = start2; itr != end2; ++itr)
     if(*start == *itr) return false;
 return true;

}


 </source>


Union two sets

<source lang="cpp">

  1. include <algorithm>
  2. include <iostream>
  3. include <vector>

using namespace std;

void print(int elem) {

 cout << elem << " ";

} int main(int argc, char** argv) {

 vector<int> setOne, setTwo, setThree;
 setOne.push_back(1);
 setOne.push_back(2);
 setOne.push_back(3);
 
 setTwo.push_back(2);
 setTwo.push_back(3);
 setTwo.push_back(4);
 // set algorithms work on sorted ranges
 sort(setOne.begin(), setOne.end());
 sort(setTwo.begin(), setTwo.end());
 setThree.resize(setOne.size() + setTwo.size());
 vector<int>::iterator newEnd;
 newEnd = set_union(setOne.begin(), setOne.end(), setTwo.begin(),setTwo.end(), setThree.begin());
 cout << "The union is: ";
 for_each(setThree.begin(), newEnd, &print);
 cout << endl;
 return (0);

}


 </source>


Use set_union to union two lists

<source lang="cpp">

  1. include <algorithm>
  2. include <functional>
  3. include <iomanip>
  4. include <iostream>
  5. include <list>
  6. include <string>
  7. 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 ) );

}


 </source>