set容器
- 所有元素会根据元素的键值自动排序。
- set容器的元素既是键值又是实值。
- 不允许拥有两个相同的键值。
- 不能通过迭代器更改元素,它是只读迭代器。因为会破坏排序规则。
- 可以删除、插入。
set构造函数
set<T> st;
multiset<T> mst;
set(const set &st) ;
set赋值操作
set& operator=(const set &st);
swap(st);
set大小操作
size();
empty() ;
set插入和删除操作
insert(elem) ;
clear() ;
erase(pos) ;
erase(beg,end) ;
erase(elem) ;
void test01 ( )
{
set<int> S ;
s. insert(30) ;
S. insert(10) ;
s. insert(20) ;
s. insert(50) ;
S. insert(40) ;
for_each(s.begin() ,s.end() ,[](int val) {cout<<val<<" ";}) ;
cout<<endl ;
}
s.erase(s.begin()) ;
for_each(s.begin() ,s.end() ,[] (int val) {cout<<val<<" "});
cout<<endl;
s.erase(40);
for_each(s.begin() ,s.end(),[] (int val) {cout<<val<<" " ;});
cout<<endl;
set<int> ::const_iterator it=s.begin() ;
cout<<"size = "<<s.size()<<endl ;
set查找
find(key) ;
若存在,返回该键的元素的迭代器;
若不存在,返回set.end() ;
count(key) ;
lower_bound(keyElem) ;
upper_bound(keyElem) ;
equal_range(keyElem) ;
set<int> :: const_iterator ret ;
ret = s.find(200) ;
if(ret == s.end())
{
cout<<"没有找到"< <endl;
}
else
cout<<s.count(20)<<end1;
cout<<s.count(200)<<end1;
- 图解:

- 例子:
set<int>::const_iterator Lower_ret;
Lower_ret = s. Lower_bound(30) ;
if(lower_ret == s.end())
{
cout<<"没有找到30的下限"<<endl;
}
else
{
cout<<"找到30的下限: "<<*lower_ret<<endl ;
}
set<int> ::const_iterator up_ret;
up_ret = s.upper_bound(30) ;
if(up_ret == s.end() )
{
cout<<"没有找到30的上限"<<endl;
}
else
{
cout<<"找到30的上限:"<<*up_ret<<endl;
}
- equal_range(key_elm);返回上下限,采用对组接收返回值(first,second)。
pair<set<int>::const_iterator, set<int>::const_iterator> pair_ret;
pair<set<int>::const_iterator,set<int>::const_iterator> pair_ret
pair_ret = s.equal_range(30) ;
if(pair_ret.first == s.end())
{
cout<<"下限未找到"<<endl;
else
{
cout<<"下限找到:"<< *(pair_ret.first) <<endl;
}
if(pair_ret.second == s.end( ) )
{
cout<<"上限未找到"<<endl;
}
else
{
cout<<"上限找到:"<< *(pair_ret.second) <<endl;
}
更改set容器的默认排序规则
- 在插入数据之前更改规则。
- 利用仿函数,不能有普通函数:
class MyGreater
{
public:
bool operator() (int val1,int val2)
{
return val1>val2 ;
}
};
set<int,MyGreater> s;
s. insert(30) ;
s. insert(10) ;
s. insert(20) ;
s. insert(50) ;
s. insert(40) ;
for_each(s.begin() ,s.end() ,[](int val) {cout<<val<<" ";}) ;
cout<<endl ;
插入自定义数据时
重载“<”
void test06( )
{
set<Person> s;
s. insert(Person("德玛西亚", 19)) ;
s. insert(Person("小法",18)) ;
s. insert(Person("小炮",21)) ;
s. insert(Person("风男",29)) ;
for_each(s.begin() ,s.end() ,[] (Person val){cout<<"name="<<val. name<<",age="<<val. ages<<endl;})
bool operator <(const Person &ob )
{
return this->age < ob.age ;
}
修改排序规则
class myGreaterPerson
{
public:
bool operator() (const Person &ob1, const Person &ob2)
{
return ob1.age > ob2.age;
}
};
set<Person, myGreaterPerson> s;
s. insert(Person("德玛西亚", 19)) ;
s. insert(Person("小法",18)) ;
s. insert(Person("小炮",21));
s. insert(Person("风男", 29)) ;
for_each(s.begin() ,s.end() ,[] (Person val) {});
multiset
multiset<int> s;
s.insert(10) ;
s.insert(10) ;
for_each(s.begin() ,s.end() ,[ ] (int val) {cout<<val<<" "<<endl ;}) ;
cout<<endl ;