C++/Set Multiset/intersect
Create the intersection of list1 and list2
#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_intersection(list1.begin(), list1.end(),list2.begin(), list2.end(),result.begin());
show_range("Intersection 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;
}
Intersect two sets
#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());
vector<int>::iterator newEnd = set_intersection(setOne.begin(), setOne.end(), setTwo.begin(),setTwo.end(), setThree.begin());
cout << "The intersection is: ";
for_each(setThree.begin(), newEnd, &print);
cout << endl;
return (0);
}
Use set_intersection to intersect 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;
set_intersection( listA.begin(), listA.end(),inspector_B.begin(), inspector_B.end(),back_inserter( result ) );
for_each( result.begin(), result.end(),mem_fun_ref( &PC::print ) );
}