c++中set容器

set容器

  • 所有元素会根据元素的键值自动排序。
  • set容器的元素既是键值又是实值。
  • 不允许拥有两个相同的键值。
  • 不能通过迭代器更改元素,它是只读迭代器。因为会破坏排序规则。
  • 可以删除、插入。
set构造函数
set<T> st; //set默认构造函数:
multiset<T> mst; //multiset默认构造函数:
set(const set &st) ;//拷贝构造函数

set赋值操作
set& operator=(const set &st);//重载等号操作符
swap(st);//交换两个集合容器

set大小操作
size();//返回容器中元素的数目
empty() ;//判断容器是否为空

set插入和删除操作
insert(elem) ;//在容器中插入元素。
clear() ;//清除所有元索
erase(pos) ;//删除pos迭代器所指的元素,返回下一一个元素的迭代器。
erase(beg,end) ;//删除区间[beg, end)的所有元素,返回下一一个元素的迭代照
erase(elem) ; //删除容器中值为elem的元素
  • 例子:
void test01 ( )
{
	set<int> S ;
	//set容器白动根据键值排序
	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<<" " ;});//20 30 50
cout<<endl;
//set容 器提供的是只读迭代器const_ iterator
//用户不可以修政set容器的元素
set<int> ::const_iterator it=s.begin() ;
//*it = 100;//err
cout<<"size = "<<s.size()<<endl ;

set查找

find(key) ;//查找键key是否存在,
若存在,返回该键的元素的迭代器;
若不存在,返回set.end() ;

count(key) ;//查找键key的元索个数
lower_bound(keyElem) ;//返回第一个key>=keyElem元 素的迭代器。
upper_bound(keyElem) ;//返回第一个key> keyElem元素的迭代器。
equal_range(keyElem) ;//返回容器中key与keyElem相等的|:下限的两个迭代器
  • 例子:
//若不存在,返回set.end() ;
set<int> :: const_iterator ret ;
ret = s.find(200) ;
if(ret == s.end())
{
	cout<<"没有找到"< <endl;
}
else
//count(key);//查找键key的元索个数
//set容器的键值是不重复的 那么count(key)只能是1或0
cout<<s.count(20)<<end1;//1
cout<<s.count(200)<<end1;//0
  • 图解:
    在这里插入图片描述
  • 例子:
//下限: lower_ bound(keyElem) ;//返回第- -个key> =keyElem元素的迭代器。
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 ;
}
//upper_ bound (keyElem) ;//返回第一个key>keyElem元素的迭代器
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;
//equal_ range (keyElem) ;
//返回容器ψkey与keyElem相等的上下限的两个迭代器
//equal_range返回的是对组
//first对组中第一个值,second对组中第二个值
pair<set<int>::const_iterator,set<int>::const_iterator> pair_ret
pair_ret = s.equal_range(30) ;

//下限lower_ bound
if(pair_ret.first == s.end())
{
	cout<<"下限未找到"<<endl;
else
{
	cout<<"下限找到:"<< *(pair_ret.first) <<endl;
}

//上限upper_bound
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,排序规则> s;
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 ;