标准库提供set关联容器分为:
1,按关键字有序保存元素:set(关键字即值,即只保存关键字的容器);multiset(关键字可重复出现的set);
2,无序集合:unordered_set(用哈希函数组织的set);unordered_multiset(哈希组织的set,关键字可以重复出现)。
set就是关键字的简单集合。当只是想知道一个值是否存在时,set是最有用的。set内部采用的是一种非常高效的平衡检索二叉树:红黑树,也称为RB树(Red-Black Tree)。RB树的统计性能要好于一般平衡二叉树。
set中的元素是排好序的且无重复元素,时间复杂度是O(logN)
set的查找使用的是二分查找
#include<iostream>
#include<set>
using namespace std;
int main(){
set<int> s;
s.insert(110);
s.insert(1);
s.insert(110);
s.insert(11);
s.insert(13);
set<int>::iterator it;
for(it=s.begin();it!=s.end();it++){
cout<<*it<<' ';
}
return 0;
}
输出:
1 11 13 110
Ⅰ.元素的访问:
与vector不同,set只能通过迭代器访问,并用*it来访问其中的元素且不支持*(it+i)的访问方式(vector和string支持)
begin()和end()函数是不检查set是否为空的,使用之前最好用empty()检验一下set是否为空
Ⅱ.内置函数
equal_range()函数,返回pair对象,其first和second成员都是迭代器,分别指向第一个大于等于输入元素的的位置和第一个大于输入元素的位置注意,若查找容器中最后一个元素
#include<iostream>
#include<set>
using namespace std;
int main(){
set<int> s;
s.insert(1);
s.insert(0);
s.insert(101);
s.insert(130);
s.insert(1213);
s.insert(142);
s.insert(1412);
pair<set<int>::iterator,set<int>::iterator>p;
p=s.equal_range(101);
cout<<*p.first<<' '<<*p.second;
cout<<endl;
p=s.equal_range(100);
cout<<*p.first<<' '<<*p.second;
cout<<endl;
p=s.equal_range(1413);
cout<<*p.first<<' '<<*p.second;
return 0;
}
输出:
101 130
101 101
7 7(超出范围)
erase()函数,不进行任何的错误检查
//erase(first,second)删除,first,second为迭代器,只能自增或自减
#include<iostream>
#include<set>
using namespace std;
int main(){
set<int> s;
s.insert(1);
s.insert(0);
s.insert(101);
s.insert(130);
s.insert(1213);
s.insert(142);
s.insert(1412);
set<int>::iterator it,first,second;
for(it=s.begin();it!=s.end();it++){
cout<<*it<<' ';
}
cout<<endl;
first=s.begin();
second=s.end();
first++;
second--;
s.erase(first,second);
for(it=s.begin();it!=s.end();it++){
cout<<*it<<' ';
}
cout<<endl;
return 0;
}
//erase(it),it为迭代器
#include<iostream>
#include<set>
using namespace std;
int main(){
set<int> s;
s.insert(1);
s.insert(0);
s.insert(101);
s.insert(130);
s.insert(1213);
s.insert(142);
s.insert(1412);
set<int>::iterator it,first,second;
for(it=s.begin();it!=s.end();it++){
cout<<*it<<' ';
}
cout<<endl;
it=s.begin();
s.erase(it);
for(it=s.begin();it!=s.end();it++){
cout<<*it<<' ';
}
cout<<endl;
return 0;
}
//erase(key_value)删除set内某个数值
#include<iostream>
#include<set>
using namespace std;
int main(){
set<int> s;
s.insert(1);
s.insert(0);
s.insert(101);
s.insert(130);
s.insert(1213);
s.insert(142);
s.insert(1412);
set<int>::iterator it,first,second;
for(it=s.begin();it!=s.end();it++){
cout<<*it<<' ';
}
cout<<endl;
s.erase(1);
for(it=s.begin();it!=s.end();it++){
cout<<*it<<' ';
}
cout<<endl;
return 0;
}
find()函数
#include <iostream>
#include <set>
using namespace std;
int main()
{
int a[11]={123,423,11,22,11,2343,32234,635,2312,43634};
set<int> s(a,a+10);
set<int>::iterator it;
for(it=s.begin();it!=s.end();it++){
cout<<*it<<' ';
}
cout<<endl;
it=s.find(1);
if(it==s.end())
cout<<"Not Find";
else
cout<<*it;
cout<<endl;
return 0;
}
lower_bound()和upper_bound()函数
#include <iostream>
#include <set>
using namespace std;
int main()
{
set<int> s;
for(int i = 1;i <= 5;i ++)
{
int x;
cin >> x;
s.insert(x);
}
set<int>::iterator iter;
for(iter = s.begin() ; iter != s.end() ; ++iter)
{
cout << *iter << " ";
}
cout << endl;
cout << "第一个大于等于 2 的值是: ";
cout<<*s.lower_bound(2)<<endl;
cout << "第一个大于等于 3 的值是: ";
cout<<*s.lower_bound(3)<<endl;
cout << "第一个大于 3 的值是: ";
cout<<*s.upper_bound(3)<<endl;
return 0;
}
insert(key_value); 将key_value插入到set中 ,返回值是pair<set<int>::iterator,bool>,bool标志着插入是否成功,而iterator代表插入的位置,若key_value已经在set中,则iterator表示的key_value在set中的位置。
inset(first,second); 将定位器first到second之间的元素插入到set中,返回值是void.
#include <iostream>
#include <set>
using namespace std;
int main()
{
int a[] = {1, 4, 3, 7};
set<int> s;
set<int>::iterator iter;
s.insert(a,a + 4);
for(iter = s.begin() ; iter != s.end() ; ++iter)
{
cout<<*iter<<" ";
}
cout<<endl;
pair<set<int>::iterator,bool> pr;
pr = s.insert(5);
if(pr.second)
{
cout<<*pr.first<<endl;
}
cout << " 插入数值之后的set中有:" << endl;
for(iter = s.begin() ; iter != s.end() ; ++iter)
{
cout<<*iter<<" ";
}
cout<<endl;
return 0;
}