set的特性是所有元素都会根据元素的键值自动被排序,所以下面的操作都是对排好序之后的容器进行操作,而不是插入的顺序。简单来说,set就好似二叉搜索树,所谓的二叉搜索树有以下两个特性:
(1).将所有小于头节点的数据放置在左边
(2).将所有大于头节点的数据放置在右边
所有的言语不如图让明白来的更快,请看下面的图所示:
如果学过数据结构与算法的朋友或许会很熟悉。set特性是所有数据会自动排序,其实内部的操作跟上图相似,一开始插入数据就已经进行排序,然后通过深度优先搜索进行打印得到的就是排好序的数据了。 这里主要就是学习set操作,对于深度优先搜索要是有兴趣的朋友可以自己去学习一下。
1.set构造函数
set<T> st; // set默认构造函数
multiset<T> mst; // multiset默认构造函数
set<T> st(const set& st1); // 拷贝构造函数到自身
2. set赋值操作
set& operator=(const set& st); // 重载=操作符
set.swap(const set& st); // 交换两个容器
3. set大小操作
set.size(); // 返回容器的大小
set.empty(); // 判断容器是否为空
4. set插入与删除操作
set.insert(elem); // 在容器中插入元素elem
set.clear(); // 清楚所有元素
set.erase(const_set::iterator pos);// 删除迭代器位置pos的元素,返回下一个数据的位置
set.erase(elem); // 删除容器中值为elem的元素
set.erase(beg, end); // 删除[beg, end)区间的所有元素,返回下一个元素的位置
这里需要注意一些细节,就是在使用erase删除的时候,删除的是排好序之后的容器位置,而不是插入的顺序,如图中插入的数据,使用erase删除第二位置的元素,应该是20,而不是30。还有一点需要注意的是,erase(需要删除的位置),如果你需要删除第三个位置的元素,不可以这样:set<int>::const_iterator it = st.begin(); erase(it+3),直接进行加操作是不可以的,需要使用++,应该为:erase(++(++it))
5. set查找操作
set.find(key); // 通过键key是否存在,若存在则返回该键的元素的迭代器,若不存在则返回set.end()
set.count(key); //查找键key的元素个数,返回的是0或者1,因为key键是不存在重复的
set.lower_bound(keyElem); // 返回第一个key>=keyElem元素的迭代器,返回的是下限的迭代器,没有下限返回的是st.end()
set.upper_bound(keyElem); // 返回第一个key>keyElem元素的迭代器,返回的是上限的迭代器
set.equal_range(keyElem); // 返回容器中key与keyELem相等的上下限的两个迭代器,以对组的方式存储上下限(和下面对组一起)
对组:对组(pair)将一对值组合成一个值,这一对值具有不同的数据类型或者相同的数据类型,两个值可以分别用pair的两个共有属性first和second
模板:templat(class T1, class T2) struct pair