概述
set ,又称集合,实际上就是一组元素的集合,但其中所包含的元素的值是唯一的,且是按一定顺序排列的
1.所有元素会根据键值自动排序
2.set与map不同,map有键值又有实值。而set的键值也是实值
3.set不允许键值相同
4.set提供的是只读迭代器(不允许修改元素的内容)
插入的时候就排好序了,要是修改了,顺序就会发生错误。
允许删除,因为删除不会破坏顺序
因为其内部是通过链表的方式来组织,所以在插入的时候比vector 快,但在查找和末尾添加上比vector 慢。
multiset是允许数据重复的set。其他都一样
set和multiset的底层实现都是红黑树
初始化set对象的方式:
set<T> v1;//默认的初始化方式,内容为空
set<T> v2(v1);//v2是v1的一个副本
set<T> v5(v1.begin(),v1.end());//v5包含v1的一个区域元素[v1.begin,v1.end());
set常用函数
v1.empty():判断集合是否为空,为空返回真,否则为假
v1.insert(数值):将数值插入v1中
返回值是对组。iterator插入的位置,bool是否插入成功
v1.insert(first,second):将定位 器first和定位器second之间的元素插入到set中
int a[] = {1,2,3}; s.insert(a,a+3);
v1.begin():返回向量(数组)的首元素地址
v1.end(): 返回向量(数组)的末元素的下一个元素的地址
v1.rbegin():返回逆向队列的第一个数据,即c容器的最后一个数据。
v1.rend():返回逆向队列的最后一个数据的下一个位置,即c容器的第一个数据再往前的一个位置。
vector<int> v; v.push_back(1); v.push_back(2); v.push_back(3); vector<int>::reverse_iterator it; for(it = v.rbegin();it!=v.rend();it++){ cout << *it << "\t"; } cout << endl;
v1.clear():清空向量
v1.size():返回得到向量中元素的个数
v1=v2:
swap(v1.v2):交换两个数组
v1.count():用来查找set中某个某个键值出现的次数。但是由于set中不允许重复,故用来判断某一键值是否在set出现过了
v1.erase(iterator):删除定位器iterator指向的值
v1.erase(first,second):删除定位器first和second之间的值
v1.erase(key_value):删除键值key_value的值
v1.find():查找一个数,返回给定值的定位器,找不到就返回迭代器end()
v1.lower_bound():返回第一个大于等于key_value的定位器
v1.upper_bound():返回第一个大于key_value的定位器
v1.equal_range():返回一对定位器,分别表示第一个大于或等于给定关键值的元素和第一个大于给定关键值的元素,这个返回值是一个pair类型,如果这一对定位器中哪个返回失败,就会等于end()的值
#include <iostream> #include <set> using namespace std; int main(){ set<int> s; set<int>::iterator iter; for(int i = 1 ; i <= 5; ++i) { s.insert(i); } for(iter = s.begin() ; iter != s.end() ; ++iter) { cout<<*iter<<" "; } cout<<endl; pair<set<int>::const_iterator,set<int>::const_iterator> pr; pr = s.equal_range(3); cout<<"第一个大于等于 3 的数是 :"<<*pr.first<<endl; cout<<"第一个大于 3的数是 : "<<*pr.second<<endl; return 0; }
set的所有函数
1.set的构造函数
set<T> st;//set 默认构造函数:
mulitset<T> mst; //multiset 默认构造函数:
set(const set &st);//拷贝构造函数
2.set的赋值
set& operator=(const set &st);//重载等号操作符
swap(st);//交换两个集合容器
3.set大小函数
size();//返回容器中元素的数目
empty();//判断容器是否为空
4.set 插入和删除操作
insert(elem);//在容器中插入元素。
返回值是对组。iterator插入的位置,bool是否插入成功
clear();//清除所有元素
erase(pos);//删除 pos 迭代器所指的元素, 返回下一个元素的迭代器。
erase(beg, end);//删除区间[beg,end)的所有元素 , 返回下一个元素的迭代器。
erase(elem);//删除容器中值为 elem 的元素。
5.set 查找操作
find(key);//查找键 key 是否存在,若存在, 返回该键的元素的迭代器; 若不存在, 返回 set.end();
count(key);//查找键 key 的元素个数
下限:lower_bound(keyElem);//返回第一个 key>=keyElem 元素的迭代器。若不存在, 返回 set.end();
上限 :upper_bound(keyElem);//返回第一个 key>keyElem 元素的迭代器。若不存在, 返回 set.end();
equal_range(keyElem);//返回容器中 key 与 keyElem 相等的上下限的两个迭代器。