C++STL容器篇set和multiset

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() 将容器清空
原创文章 23 获赞 1 访问量 371

猜你喜欢

转载自blog.csdn.net/weixin_44806268/article/details/105452465