一、set/multiset容器特性
会将所有元素根据元素的值进行排序,set是以RB-tree(红黑树-平衡二叉树的一种)为底层机制,其查找效率非常好,set容器不允许出现重复的元素,而multiset允许出现重复的元素。
注意:
- 由于会自动排序,所以该容器不会提供push_back,push_front,pop_back,push_front这样的插入方法,只提供insert()的插入方法。
- 不可以通过set的迭代器改变某一位置的值,因为这样就不一定满足RB-tree,如果非要把某一位置的数改了,就先删了该位置的元素,在添加要改成的元素。
常用API
1、构造函数
set<T> st;//set默认构造函数:
mulitset<T> mst; //multiset默认构造函数:
set(const set &st);//拷贝构造函数
2、set的赋值操作
set& operator=(const set &st); //重载等号操作符
swap(st); //交换两集合容器
3、set大小操作
size();//返回容器中元素的数目
empty();//判断容器是否为空
4、set插入和删除操作
insert(elem); //在容器中插入元素
clear(); //清楚所有元素
erase(pos); //删除pos迭代器所指向的元素,返回下一个元素的迭代器
erase(beg,end); //删除区间[beg,end]的所有元素,返回下一个元素的迭代器
erase(elem);//删除容器中值为elem的元素
5、set查找操作
find(key); //查找可以是否存在,若存在,返回该建的元素的迭代器,若不存在,返回end()迭代器。
lower_bound(keyElem);//返回第一个key>=keyElem元素的迭代器。
upper_bound(keyElem);//返回第一个key>keyElem元素的迭代器
equal_range(keyElem);//返回容器中key与keyElem相等的上下限的两个迭代器。
例:
#include <iostream>
#include <set>
using namespace std;
int main()
{
set<int> s1;
s1.insert(3);
s1.insert(7);
s1.insert(8);
s1.insert(1);
s1.insert(2);
set<int>::iterator it= s1.find(1);
if(it==s1.end()) cout << "没有找到" << endl;
else cout <<"找到了" << endl;
it=s1.lower_bound(2); //返回大于等于指定值的位置
cout << *it << endl;
it=s1.lower_bound(4); //返回大于等于指定值的位置
cout << *it << endl;
/*
同理upper_bound()是大于等于指定元素的迭代器
*/
//equal_range返回lower_bound和upper_bound的值
pair<set<int>:: iterator,set<int>:: iterator>myret=s1.equal_range(2);
if(myret.first == s1.end())
{
cout << "没有找到" << endl;
}
if(myret.second == s1.end())
{
cout << " 没有找到" << endl;
}
if(myret.first != s1.end())
{
cout << "找到了" << *(myret.first)<<endl;
}
if(myret.second != s1.end())
{
cout << "找到了" <<*(myret.second) << endl;
}
return 0;
}
二、对组
队组(pair)将一对值组合成一个值,这一对值可以具有不同的数据类型,两个值可以分别用pair的两个共有函数first和second访问。
类模板:
intemplate <class T1,class T2> struct pair
1、创建方法
//第一种
pair<string,int> pair1(string("name"),20);
cout << pair1.first << endl;//访问pair第一个元素
cout << pair.second << endl; //访问pair第二个元素
//第二种
pair <string,int> pair2=make_pair("nmae",30);
cout << pair2.first << endl;//访问pair2第一个元素
cout << pair2.second << endl; //访问pair2第二个元素
2、pair赋值
pair<string,int> pair3=pair2;
cout << pair3.first << endl;//访问pair3第一个元素
cout << pair3.second << endl; //访问pair3第二个元素