在STL中常用的关联容器有set和map,其他multiset和multimap是这两个容器的扩展,区别就是打破了键值得唯一性,而在set和map中键值是唯一的,即使插入两个相同键的数据,在容器中也只保留一个。set容器内部只有键值而没有实值(我也不知道为什么还能称之为关联容器),而map里存放着元素是pair<T1,T2>对象。
set和map内部都实现了红黑树的结构就是平衡搜索树。所以它的优势是快速的插入删除、以及查找,其时间复杂度是log2N。
一. set
1.创建对象
set<T1> s;
//对于不是自己定义的数据类型,像int,double等可以不定义比较方式。
set<T,CmpStruct> s;
//自定义比较结构体
set<T,DefineStruct> s;
//自定义数据类型
//不是自定义的数据类型 ,定义比较结构就行,内部重载()
//注意不是只定义比较函数,因为set参数是结构体类型
struct CmpStruct
{
//重载()操作符,结构名+括号就成了函数的形式,好有趣
bool operator()(const T1 a, const T2 b)
{
return a<b;//从小到大
}
}
//对于自定义的数据类型 ,内部要重载<运算符
struct DefineStruct
{
int id;
string name;
bool operator<(const DefineStruct &a)
{
return this->id < a.id;
}
}
2.插入删除
insert(key):容器内部会根据红黑树的结构插入到相应位置。
erase(key):删除相应键值。
3.遍历
由于内部结构直接遍历(中序遍历)出的就是排序好的数据,这里遍历不像vector,只能使用迭代器。
4.查找
find(key):返回相应地址位置,iterator类型。如果找不到,返回值为s.end()。
set<T> s::iterator it = s.find(key);
if(it != s.end())
cout<<"找到了";
else
cout<<"没找到";
二. map
map的操作和set基本一样,优势同样是快速插入删除,查找。
创建对象时要自定义比较函数的同set
1.插入
insert(pair<T1,T2>(a,b))插入pair对象
map重载了[]操作符,m[key]=new_value;可以实现修改实值得功能,当key不存在与map中时,会创建key并初始化为new_value;
[]还可以用于访问元素,像数组一样。
2.删除
通过key删除数据
erase(key)
3,查找和set也是一样的