关联容器内部的元素依据其值自动排序,内部由二叉树实现便于查找
可以看到上述示例,如果不动态调整内部的元素的排列的话可能会使左边这样通过剪枝便于查找的结构退化成单链表形式,所以set和map是基于平衡二叉树
#include
#include
#include
using namespace std;
class Student
{
public:
Student(string number, string name) :m_number(number), m_name(name)
{}
bool operator<(const Student& s) const
{
int mark = m_number.compare(s.m_number);
return mark < 0 ? true : false;
}
string getNumber()const
{
return m_number;
}
string getName()const
{
return m_name;
}
private:
string m_number;
string m_name;
};
ostream& operator<<(ostream& os, const Student& s)
{
os << s.getNumber() << "\t" << s.getName() << endl;
return os;
}
template ,typename A=allocator>
class MySet:public set
{
public:
MySet(const T* first, const T* last) :set(first, last)
{}
//并
void add(MySet& second)
{
for(typename set::iterator iter = second.begin();
iter != second.end(); iter++)
{
set::insert(*iter);
}
}
//交
void interSect(MySet& second)
{
//定义临时空的集合
set mid;
//遍历当前集合,如果当前元素在第二个集合中的话,加入临时集合中
for (typename set::iterator iter = this->begin();
iter != this->end(); iter++)
{
if (second.find(*iter) != second.end())
{
mid.insert(*iter);
}
}
//利用swap函数交换临时集合
set::swap(mid);
}
//差
void difference(MySet& second)
{
//定义临时空的集合
set mid;
//遍历当前集合,如果当前元素不在第二个集合中的话,加入临时集合中
for (typename set::iterator iter = this->begin();
iter != this->end(); iter++)
{
if (second.find(*iter) == second.end())
{
mid.insert(*iter);
}
}
//利用swap函数交换临时集合
set::swap(mid);
}
void show()
{
for (typename set::iterator iter = this->begin();
iter != this->end(); iter++)
{
cout << *iter << endl;
}
}
};
int main()
{
Student s[2] = {
{Student("1001","Lily")},
{Student("1002","Lucy")}
};
Student t[3] = {
{Student("2001","Mark")},
{Student("1001","Lily")},
{Student("2002","Liber")}
};
MySet m1(s,s+2);
MySet m2(t, t + 3);
m1.show();
m2.show();
cout << "\n-------测试并-------" << endl;
m1.add(m2);
m1.show();
cout << "\n-------测试交-------" << endl;
MySet m3(s, s + 2);
MySet m4(t, t + 3);
m3.interSect(m4);
m3.show();
cout << "\n-------测试差-------" << endl;
MySet m5(s, s + 2);
MySet m6(t, t + 3);
m5.difference(m6);
m5.show();
}
//CWord:对用户输入一组记录进行同义词封装
//CWordMgr:对每组记录使用map进行管理:插入,显示
#include
#include
#include