set/multiset容器
基本概念
所有元素在插入时会自动排序(从小到大)
本质
set/multiset属于关联式容器,底层结构是用二叉树实现
set和multiset的区别
- set不允许容器中有重复的元素
- multiset允许有重复元素
set容器构造函数
set容器没有push_back的插入元素方式,只能用insert
set容器依然有拷贝构造
当set容器中插入相同的数据时,编译器不会报错,但实际上并不会插入重复的数据
set<int>s;
s.insert(20);
s.insert(10);
s.insert(20);
容器中只有10和一个20.
set大小和交换
函数原型:
-
size() 返回元素数目
-
empty() 判断容器是否为空
-
swap(st) 交换两个容器
注意
set容器没有重新指定容器大小的操作,因为重新指定大小时,若指定的大小比原有个数大时,会用0填充,填充的部分不一定只有一个,可能有多个,这样就违背了set容器中没有重复数据的原则。
set插入与删除
函数原型:
insert(elem) 插入元素
clear() 清空容器
erase(pos) 删除pos迭代器所指的元素,返回下一个元素的地址
erase(beg,end) 删除区间【beg,end)的所有元素
erase(elem) 删除容器中值为elem的元素。
注:
.begin() 返回的是排序后的第一个元素的地址。
set查找和统计
对set容器进行查找数据以及统计数据
函数原型:
- find(key) 查找key是否存在。存在则返回位置,不存在则返回end
- count(key) 查找key的元素个数
注:
set容器中无重复元素,所以count的返回值只能是0或1;但是multiset容器可以有其他值。
set的 insert插入数据时的返回值
set容器的insert插入数据时,是有返回值的,返回值的类型是pair型(对组),里面有两个数据,第一个数据为迭代器类型,表示插在哪里,第二个为布尔类型,表示是否插入成功。
下面展示,如何接收这个返回值
set<int>s;
pair<set<int>::iterator,bool>ret=s.insert(10