C++/Set Multiset/union
Содержание
Create the union of two lists
<source lang="cpp">
- include <iostream>
- include <list>
- 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">
- include <iostream>
- include <list>
- 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">
- include <algorithm>
- include <iostream>
- 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">
- 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 ) );
}
</source>