set和multiset和特点: 通常底层由红黑树实做而成,会将放入的元素自动排序,所以其优点为搜索元素时具有良好的性能,使用时需包含头文件set,打开std命名空间。
set和multiset不同之处: set不能放相同的元素,重复放入相同的元素只会放入一个,multiset可以放入相同的元素。
set和multiset的迭代器类型: 双向迭代器
set和multiset的初始化
template<class T,class Compare=less<T>,class Allocator = allocator<T>>
class set;
template<class T,class Compare=less<T>,class Allocator = allocator<T>>
class multiset;
//第一参数元素类型,第二参数排序准则应传入一个仿函数,第三参数分配器
//通常没有特殊要求只需指定第一参数类型
//若需相反的排序准则,可包含#include<functional> 调用greater<T>
set<T>c;
set<T,OP>c1;
set<int>c={1,2,3,4,5};//列表初始化
set<T>c1(c2); //将c2的元素副本赋值给c1
set<T>c1(iterator1,iterator2) //将[iterator1,iterator2)元素副本赋值给c1
c.~set(); //销毁所有元素,释放内存
multiset----set 同上
非变动性操作函数 | 效果 |
---|---|
c.size() | 返回容器的大小 |
c.empty() | 判断容器是否为空 |
c.max_size() | 返回可容纳的最大元素数量(一般不用) |
c1==c2 | |
c1!=c2 | |
c1<c2 | |
c1>c2 | |
c1<=c2 | |
c1>=c2 |
比较操作以字典顺序来比较,比较只能用于模板参数类型都一样的容器。
搜寻操作函数 | 效果 |
---|---|
c.count(elem) | 返回元素elem的个数 |
c.find(elem) | 返回指向元素值为elem的第一个元素iterator,如果找不到就返回c.end() |
c.lower-bound(elem) | 返回第一个大于等于elem值的元素位置的迭代器 |
c.upper_bound(elem) | 返回第一个大于elem值的元素位置的迭代器 |
c.equal_range(elem) | 返回第一个大于等于elem值的元素位置的迭代器,和大于elem的迭代器,返回类型为pair将两个迭代器组合 |
赋值操作 | 功能 |
---|---|
c1=c2 | 将c2的所有元素的副本添加到c1 |
c1.swap(c2) | 交换c1,c3的所有元素 |
swap(c1,c2) | 效果同上,但效率不好,应该该版本是泛化版本 |
迭代器函数 | 效果 |
---|---|
c.begin() | 返回一个双向迭代器,指向第一个元素 |
c.end() | 返回一个双向迭代器,指向最后一个元素的下一位置 |
c.rbegin() | 返回一个逆向迭代器,指向逆向遍历的第一个元素 |
c.rend() | 返回一个逆向迭代器,指向逆向遍历的最后一个元素的下一位置 |
这里的迭代器是双向迭代器,所以对于使用随机存放迭代器的STL算法,set和multiset无法使用,对于迭代器来说,所有元素都被视为常数,这确保使用者不会人为的改变元素值,从而打乱既定顺序。如果我们要操作容器的元素只能调用容器提供的成员函数。
set和multiset的安插,移除操作函数 | 效果 |
---|---|
c.insert(elem) | 安插一份elem的副本,如果c为set,返回一个pair<>将iterator和bool组合在一起的类型,其中第一个参数指向插入元素,第二参数返回是否插入成功,multiset则返回一个指向插入元素的iterator |
c.insert(iterator,elem) | 效果同上,iterator为提示插入位置,若有效可以大大减少插入时间,返回指向插入元素的iterator |
c.insert(iterator1,iterator2) | 将区间[)内容副本插入c中,无返回值 |
c.erase(elem) | 移除所有与elem相等的元素返回被移除元素的个数,返回类型 set<>::size_type |
c.erase(iterator) | 移除迭代器指向位置的元素,返回指向下一元素的迭代器 |
c.erase(iterator1,iterator2) | 移除区间[iterator1,iterator2)移除区间内所有元素,返回iterator2迭代器 |
c.clear() | 将容器清空 |