C++STL学习——Set集合

简单介绍

  • 集合(Set)是一种包含已排序对象的关联容器,其中所包含的元素是唯一的,集合中的元素按一定的顺序排列。元素插入过程是按排序规则插入,所以不能指定插入位置。
  • set采用红黑树变体的数据结构实现,红黑树属于平衡二叉树。在插入操作和删除操作上比vector快。
  • set不可以直接存取元素。(不可以使用at.(pos)与[]操作符)。
  • 不可以直接修改set容器中的元素值,因为该类容器是自动排序的。如果希望修改一个元素值,必须先删除原有的元素,再插入新的元素。
  • 头文件#include<set>

set对象的默认构造

set<int> setlnt; //一个存放int的容器
set<float> setFloat; //一个存放float的容器
set<string> setString; //一个存放string的容器

set插入与迭代器

insert(a); //在容器中插入元素
begin(); //返回容器中第一个数据的迭代器
end(); //返回容器中最后一个数据之后的迭代器 
rend(); //返回容器中倒数最后一个元素的后面的迭代器。
rbegin(); ////返回容器中倒数第一个元素的迭代器。

set排序

set默认按升序排序,如果想降序排序,可以:

set<int,greater<int> > setInt1;//按降序排序,注意最后`> >`中间有一个空格
set<int,less<int> > setInt2; //按升序排序

set删除

erase(value); //删除容器中值为value的元素
erase(it); //删除it迭代器所指的元素,返回下一个元素的迭代器
erase(beg,end); //删除区间[beg,end)的所有元素,返回下一个元素的迭代器

set查找

find(value); //在容器中查找值等于value的值,并返回指向value的迭代器

代码演示

#include<set>
#include<iostream>
#include<iterator>
using namespace std;
int main()
{
	set<int,greater<int> > s; //降序排序
	int a[6]={4,5,3,1,2,6};
	int j=0;
	while(i<sizeof(a)/sizeof(int)) //数组a插入到set集合中
	{
		s.insert(a[j]);
		j++;
	}
	//迭代器输出集合中的元素
	for(set<int>::iterator it=s.begin();it!=s.end();it++)
	{
		cout<<*it<<" ";
	}
	cout<<endl;
	set<int>::iterator i=s.find(3); //查找值为3的元素,并返回对应的迭代器
	if(i!=s.end()) //如果查找成功,则删除
		s.erase(i);
	//再次输出集合中的元素
	for (set<int>::iterator it = s.begin(); it != s.end(); it++)
	{
		cout << *it << " ";
	}
	cout<<endl<<s.size()<<endl; //输出集合中元素的个数
	s.erase(2); //删除集合中值为2的元素
	for (set<int>::iterator it = s.begin(); it != s.end(); it++)
	{
		cout << *it << " ";
	}
	cout<<endl<<s.size()<<endl;
	s.erase(s.begin(),s.end()); //删除集合从头到尾之间的元素
	cout<<s.size()<<endl; //输出0
	return 0;
}

pair使用

  • pair译为对组,可以将两个值视为一个单元
  • pair<T1,T2>存放的两个值的类型,可以不一样,如T1为int,T2为float。T1,T2也可以是自定义类型。
  • pair.first是pair里面的第一个值,是T1类型。
  • pair.second是pair里面的第二个值,是T2类型。
equal_range(); //返回集合中与给定值相等的上下限的两个迭代器,上限是闭区间,下限是开区间,如[beg,end)。这两个迭代器,封装在pair中。
#include<set>
#include<iostream>
#include<iterator>
using namespace std;
int main()
{
	set<int,less<int> > s; //按升序排列
	int a[6]={4,5,3,1,2,6};
	int j=0;
	while(j<sizeof(a)/sizeof(int))
	{
		s.insert(a[j]);
		j++;
	}
	for(set<int>::iterator it=s.begin();it!=s.end();it++)
	{
		cout<<*it<<" ";
	}
	cout<<endl;
	pair<set<int>::iterator,set<int>::iterator> pa=s.equal_range(3);
	set<int>::iterator be=pa.first;
	set<int>::iterator en=pa.second;
	cout<<*be<<" "<<*en<<endl; //输出:3 4;左闭右开区间
	return 0;
}

set重载

set也可以对自定义类型进行排序
例如:对一个(姓名,年龄)自定义类型按照年龄从小到大排序

#include<set>
#include<iostream>
#include<iterator>
using namespace std;
struct st
{
	char name[10];
	int age;
	bool operator < (const st &y) const //重载<运算符
	{
		return age<y.age;
	}
}p[5];
int main()
{
	set<st> s;
	for(int i=0;i<5;i++)
	{
		cin>>p[i].name>>p[i].age;
		s.insert(p[i]);
	}
	for(set<st>::iterator it=s.begin();it!=s.end();it++)
	{
		cout<<it->name<<" "<<it->age<<endl;
	}
	return 0;
}

其他常用函数简介

clear(); //清除所有元素
count(); //返回某个值元素的个数(因为set容器中,元素不重复,所有只有0或1值,也即判断容器中是否存在某元素)
empty(); //判断容器是否为空
size(); //返回容器内元素的个数
swap(); //交换两个容器的元素

猜你喜欢

转载自blog.csdn.net/qq_41822647/article/details/84879869