STL容器——set/multiset
1、set概念
- set的特点是所有元素都会根据元素的键值自动被排序。set的元素不像map那样可以同时拥有值和键,set的元素本身既是键又是值。set不允许两个元素有相同的键值。
- 不可以通过set的迭代器不能改变set元素的值。因为set元素元素值就是其键值,关系到set元素的排序规则。如果任意改变set元素值,会严重破坏set组织。
- set拥有和list某些相同的性质,当对容器中的元素进行插入操作或者删除操作的时候,操作之前所有的迭代器,在操作结束后依然有效。
2、multiset概念
-
multiset特性及用法和set完全相同。唯一的差别在于它允许键值重复。set和multiset的底层实现是红黑树,红黑树为平衡二叉树的一种。
-
二叉树就是任何结点最多只允许有两个子结点。分别是左子节点和右子节点。
-
二叉搜索树,是指二叉树中的结点按照一定的规则进行排序,使得对二叉树中元素更加高效,二叉搜索树的放置规则是:任何结点的元素值一定大于其左子树中的每一个结点的元素值,并且小于其右子树的值。因此从根结点一直向左走,一直到无路可走,即得到最小值,一直向右走,直至无路可走,可得到最大值。
-
当一个二叉搜索树左子树和右子树不平衡的时候,在上图搜索9所花费的时间要比搜索17所花费的时间要多,由于我们输入或者经过插入删除操作,二叉树失去平衡,造成搜索效率降低。
3、set构造函数
- set<T> st;//默认构造函数
- multiset<T> mst;//multiset默认构造函数
- set(const set &st);//拷贝构造函数
4、set赋值操作
- set& operator=(const set &st);//重载等号操作符
- swap(st);//交换两个集合容器
5、set大小操作
- sise();//返回容器中元素的数目
- empty();//判断容器是否为空
6、set插入和删除操作
- insert(elem);//在容器中插入元素
- clear();//清除所有元素
- erase(pos);//删除pos迭代器所指的元素,返回下一个元素的迭代器
- erase(beg,end);//删除区间[beg,end)的所有元素,返回下一个元素的迭代器。
- erase(elem);//删除容器中值为elem的元素
// 1,3,5,6,9,11
set<int>::iterator itBegin=setInt.begin();
++ itBegin;
set<int>::iterator itEnd=setInt.begin();
++ itEnd;
++ itEnd;
++ itEnd;
setInt.erase(itBegin,itEnd);
//此时容器 setInt 包含按顺序的 1,6,9,11 四个元素。
//删除容器中第一个元素
setInt.erase(setInt.begin()); //6,9,11
//删除容器中值为 9 的元素
set.erase(9);
//删除 setInt 的所有元素
setInt.clear(); //容器为空
7、set查找操作
- find(key);//查找key是否存在,若存在,返回该键的元素的迭代器,若不存在,返回set.end();
- count(key);//查找键key的元素个数
- lower_bound(keyElem);//返回第一个key>=keyElem元素的迭代器
- upper_bound(keyElem);//返回第一个key>keyElem元素的迭代器
- equal_range(keyElem);//返回容器中key和keyElem相等的上下限的两个迭代器
set<int> setInt;
setInt.insert(3);
setInt.insert(1);
setInt.insert(7);
setInt.insert(5);
setInt.insert(9);
set<int>::iterator itA = setInt.find(5);
int iA = *itA; //iA == 5
int iCount = setInt.count(5); //iCount == 1
set<int>::iterator itB = setInt.lower_bound(5);
set<int>::iterator itC = setInt.upper_bound(5);
int iB = *itB; //iB == 5
int iC = *itC; //iC == 7
8、对组(pair)
- 对组(pair)将一对值组合成一个值,这一对值可以具有不同的数据类型,两个值可以分别用pair的两个公有属性first和second访问。
- 类模板:template <class T1,class T2> struct pair.
- 创建对组
//第一种
pair<string,int> pair1(string("name"),20);
cout << pair1.first << endl;//访问第一个值
cout << pair1.second << endl;//访问第二个值
//第二种
pair<string,int> pair2=make_pair("name",20);
//pair=赋值
pair<string,int> pair3 = pair2;