首页 > 其他分享 >set/multiset

set/multiset

时间:2024-02-21 17:13:59浏览次数:27  
标签:容器 set 迭代 元素 键值 multiset

set/multiset容器

Set的特性是。所有元素都会根据元素的键值自动被排序。Set的元素不像map那样可以同时拥有实值和键值,set的元素即是键值又是实值。Set不允许两个元素有相同的键值。

我们可以通过set的迭代器改变set元素的值吗?不行,因为set元素值就是其键值,关系到set元素的排序规则。如果任意改变set元素值,会严重破坏set组织。换句话说,set的iterator是一种const_iterator.

set拥有和list某些相同的性质,当对容器中的元素进行插入操作或者删除操作的时候,操作之前所有的迭代器,在操作完成之后依然有效,被删除的那个元素的迭代器必然是一个例外。

​ multiset特性及用法和set完全相同,唯一的差别在于它允许键值重复。set和multiset的底层实现是红黑树,红黑树为平衡二叉树的一种。

1.set容器是关联式容器,容器自身有规则,通过键值排序,set容器中的元素是键值也是实值

2.set容器和multiset容器的区别是multiset允许有相同的元素

3.数据结构:平衡二叉树

4.迭代器:双向迭代器

5.常用的api:

​ 1.构造

set<T> st;//set默认构造函数:
mulitset<T> mst; //multiset默认构造函数: 
set(const set &st);//拷贝构造函数

​ 2.赋值

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

​ 3.大小

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

​ 4.插入和删除

insert(elem);//在容器中插入元素。
clear();//清除所有元素
erase(pos);//删除pos迭代器所指的元素,返回下一个元素的迭代器。
erase(beg, end);//删除区间[beg,end)的所有元素 ,返回下一个元素的迭代器。
erase(elem);//删除容器中值为elem的元素。

​ 5.查找操作

find(key);//查找键key是否存在,若存在,返回该键的元素的迭代器;若不存在,返回set.end();
count(key);//查找键key的元素个数
lower_bound(keyElem);//返回第一个key>=keyElem元素的迭代器。
upper_bound(keyElem);//返回第一个key>keyElem元素的迭代器。
equal_range(keyElem);//返回容器中key与keyElem相等的上下限的两个迭代器。pair类型 返回大于等于的数

6.改变规则:默认是从小到大,改变规则,加入谓词到<>第二个参数中

//验证set插入是否成功 因为插入失败或成功不会报错
void test01(){

	set<int> s;
	pair<set<int>::iterator,bool> ret = s.insert(10);
	if(ret.second){
		cout <<"插入成功:"<<*ret.first << endl;
	}
	else{
		cout <<"插入失败:"<<*ret.first << endl;
	}
}

//谓词
struct MyCompare02{
	bool operator()(int v1,int v2){
		return v1 > v2;
	}
};

//set从大到小
void test02(){

	srand((unsignedint)time(NULL));
	//我们发现set容器的第二个模板参数可以设置排序规则,默认规则是less<_Kty>
	set<int, MyCompare02> s;
	for(int i =0; i <10;i++){
		s.insert(rand()%100);
	}
	
	for(set<int, MyCompare02>::iterator it = s.begin(); it != s.end(); it ++){
		cout <<*it <<" ";
	}
	cout << endl;
}

//set容器中存放对象
class Person{
public:
	Person(string name,int age){
		this->mName = name;
		this->mAge = age;
	}
public:
	string mName;
	int mAge;
};

//排序谓词
struct MyCompare03{
	booloperator()(const Person& p1,const Person& p2){
		return p1.mAge > p2.mAge;
	}
};

void test03(){

	set<Person, MyCompare03> s;

	Person p1("aaa",20);
	Person p2("bbb",30);
	Person p3("ccc",40);
	Person p4("ddd",50);

	s.insert(p1);
	s.insert(p2);
	s.insert(p3);
	s.insert(p4);

	for(set<Person, MyCompare03>::iterator it = s.begin(); it != s.end(); it++){
		cout <<"Name:"<< it->mName <<" Age:"<< it->mAge << endl;
	}

}

7.注意:

​ 1.set容器插入相同元素时,不会报错,但是不插入数据

​ 2.set容器存储对象时,需要告诉set容器的规则

标签:容器,set,迭代,元素,键值,multiset
From: https://www.cnblogs.com/wbcde116/p/18025690

相关文章

  • redis自学(2)IntSet
    IntSetIntSet是redis中set集合的一种实现方式,基于整数数组来实现,并且具备长度可变、有序等特征。  可能会有疑惑,int8_t的数组contents只有1个字节,怎么可能存的下数组,其实这里的contents存储的只是指向真正数组的指针。IntSet的取值范围大小,实际上是由encoding属性决定的......
  • Go - charset and encoding
    Weshouldunderstandthedistinctionbetweenacharsetandanencoding:Acharset,asthenamesuggests,isasetofcharacters.Forexample,theUnicode charsetcontains2^21characters.Anencodingisthetranslationofacharacter’slistinbinary.F......
  • dremio FileDatasetHandle 简单说明
    FileDatasetHandle是DatasetHandle的扩展,核心是对于文件系统类的处理(dremio对于文件系统的支持主要是基于hdfs)同时支持对于不同表格式的处理(deltalake,iceber,parquet),单独说明FileDatasetHandle主要是因为此实现比较重要dremio不少文件的处理都和此有关联FileDatasetHandle的一......
  • Unity基于AssetBundle资源管理流程详解
    在Unity游戏开发中,资源管理是一个非常重要的环节。随着游戏的发展,资源会变得越来越庞大,因此需要一种高效的资源管理方式来减少内存占用和加快加载速度。AssetBundle是Unity提供的一种资源打包和加载方式,可以将资源打包成一个独立的文件,然后在运行时进行加载和卸载。本文将详细介绍......
  • because it set 'X-Frame-Options' to 'sameorigin'
    报错becauseitset'X-Frame-Options'to'sameorigin'.Refusedtodisplay'https://xxx.xxx.cn/'inaframebecauseitset'X-Frame-Options'to'sameorigin'.解决方法:修改页面,增加meta配置<head><!--CSP......
  • 【已解决】IDEA项目启动时Maven报错:Downgrade Maven to version 3.8.1 or earlier in
    报错场景如下:Possiblesolutions:CheckthatMavenpomfilesnotcontainhttprepositoryhttp://mvn.gt.igexin.com/nexus/content/repositories/releases/CheckthatMavenpomfilesnotcontainhttprepositoryhttp://repo1.maven.org/maven2Addamirror(s)forhtt......
  • Java集合篇之set,面试官:请说一说HashSet、LinkedHashSet、TreeSet的区别?
    写在开头Java的集合世界中主要由List,Set,Queue,Map构成,我们在之前的博文中已经学习了List,接下来我们继续学习Set集合。Set特点:存取无序,不可以存放重复的元素,不可以用下标对元素进行操作HashSet作为Set容器的代表子类,HashSet经常被用到,我们通过源码去分析它【源码查看】public......
  • Qt QTabWidget显示隐藏tab页方法(setTabVisible)
    QT中QTabWidget在Qt5.15引入了setTabVisible方法低版本实现方法1//TabWidget2classTabWidget:publicQTabWidget3{4Q_OBJECT56public:78classwidgetTab{9public:10QStringtext;11QWidget*w......
  • Inno Setup使用总结
    InnoSetup是一个免费的Windows安装程序制作软件,其使用核心在于.iss脚本文件的制作,脚本制作完成后,可进行构建-编译制作安装包。1宏定义#define自定义一些全局变量,可以在下文中用到,定义安装包名称变量如下:#defineMyAppName"呼吸机服务安装包"2[Setup]设置安装包名称、......
  • 使用Redis的ZSet集合实现接口限流
    背景一般在设计后端接口的时候,一般都会预估接口能承受的最大流量是多少。那么如果瞬时流量超过了接口的承载力,我们就需要考虑接口做限流处理了。限流实际上是指限制系统的输入流量和输出流量已保持系统的稳定性,防止极端条件下系统因为突然的请求激增而造成的崩溃。思考我们知......