//write_container.cpp
#include <string>
using std::string;
template<class Iterator>
void write_container(Iterator first, Iterator last, const string separator = " ")
{
Iterator iter = first;
while(iter != last)
{
cout << *iter << separator;
iter++;
}
cout << endl;
}
///////////main.cpp
#include <iostream>
#include <fstream>
#include "write_container.cpp"
#include <set>
#include <string>
using namespace std;
template<class T> set<T> operator * (const set<T> & lre, const set<T> & rre);
template<class T> set<T> operator + (const set<T> & lre, const set<T> & rre);
template<class T> set<T> operator - (const set<T> & lre, const set<T> & rre);
int main()
{
char ch_arr[10] = {'A','N','F','E','A','M','K','N','B','F'};
set<char> setA(ch_arr,ch_arr+4), setB(ch_arr+4,ch_arr+10); // ?半开区间?
set<char> intersection = setA*setB;
write_container( intersection.begin(), intersection.end() );
set<char> setU = setA + setB;
write_container( setU.begin(), setU.end() );
set<char> setD = setB - setA;
write_container( setD.begin(), setD.end() );
return 0;
}
// 交集
template<class T> set<T> operator * (const set<T> & lre, const set<T> & rre)
{
// 交集
set<T> setInterSection;
set<T>::const_iterator lre_ite = lre.begin(), rre_ite = rre.begin();
// 如果没有达到集合末尾,则移动迭代器
while( lre_ite != lre.end() && rre_ite != rre.end() )
{
if ( *lre_ite < *rre_ite )
lre_ite++;
else if (*lre_ite > *rre_ite)
rre_ite++;
else
{
setInterSection.insert( *lre_ite);
lre_ite++;
rre_ite++;
}
}
return setInterSection;
}
// 并集
template<class T> set<T> operator + (const set<T> & lre, const set<T> & rre)
{
set<T> unionSet(lre);
set<T>::const_iterator ite = rre.begin(), ite_end = rre.end();
while( ite != ite_end)
{
unionSet.insert( *ite);
ite++;
}
// A集没有B集的元素,就将b的元素加入并集中
/*
set<T>::const_iterator ite = rre.begin(), ite_end = rre.end();
while( ite != ite_end)
{
if ( unionSet.find( *ite) == unionSet.end() )
unionSet.insert( *ite);
ite++;
}
*/
return unionSet;
}
// 差集
template<class T> set<T> operator - (const set<T> & lre, const set<T> & rre)
{
set<T> differSet(lre);
set<T>::const_iterator ite = rre.begin();
set<T>::iterator temp;
while( ite != rre.end() )
{
temp = differSet.find( * ite);
if ( temp != differSet.end() )
differSet.erase(temp);
++ite;
}
return differSet;
}