set/multiset 容器又被称为集合容器
它们都属于关联式容器
1.这两个容器的容器头文件是同一个 --- #include
和其它的容器没什么区别
1.set容器只有一个方法能够插入数据 --- 那就是insert方法,没有其它那些什么尾插法,头插法
2.当我们向set容器中插入多个一样的数据时,只有第一个插入的数据可以插入成功,其它一样的 数据都会插入失败
1.对于set容器而言,统计元素key的个数的结果无非是0/1 --- 因为set容器中不能够有重复的元素出现,但是multiset容器中则结果可能大于1(multiset容器中能够有重复的元素出现)
1.set容器在插入数据后会对插入是否成功进行一个判断,并将判断的结果返回给我们
而multiset容器则不会进行检测,判断是否插入成功
2.向set容器中插入一个数据的时候,首先会将数据和容器中的所有数据比较一遍,看看有没有相同的数据,如果有的话,则判断该数据插入失败
当我们在调用insert方法向set容器中插入数据后,这个insert方法会返回一个对组(所谓的对组即由多个数据组合而成的一个复合数据),比如上面这个对组中包含了一个指向我们插入的位置的set迭代器和一个对插入是否成功做判断的bool值
对于multiset容器而言,则没有遍历比较,也没有bool判断,它只有一个插入后自动排序以及它调用了insert方法插入了一个数据后也会有返回值,这个返回值是一个指向插入位置的multiset迭代器
1.< >里应该改成 type1 和 type2 ,其中type1类型和value1的类型一致,type2类型和value2的类型一致
2.pair对组的本质也是类模板容器,只不过使用它的时候不需要我们包含什么头文件。这个pair类模板中有两个成员属性,第一个成员属性的类型是 type1 ,第二个是 type2
3.访问和操作对组中的成员属性的方式就是 对象名 + 点操作符 + 属性名
在对组中类型是type1类型的属性的属性名是 first ,是type2的则是 second
4.上面的第一种创建方法是调用对组的有参构造函数,第一个参数是传给first属性的,第二个是传给second属性的
5.第二种创建方法则是调用make_pair方法创建一个对组后再将这个对组赋值给我们创建的对组对象
当我们向set容器中插入数据的时候,set容器会自动将我们插入的数据从大到小排序,那么我们能不能改变它的排序方式呢?如果能的话又该怎么改变呢?
此时我们改变set容器排序的方法是 --- 仿函数法
什么是仿函数?首先我们在一个类中重载函数调用符号(),然后通过这个类实例化一个对象temple,并让这个对象调用这个重载函数 ---> temple.operator()(参数) --->这个调用结果可以简化为temple(参数) --- 这个形式和函数很像,但它本身不是函数而是对象在调用它的成员函数,所以我们将这种形式称为仿函数
接下来我们开始修改set容器的排序方式:
1.创建一个类(类名随意定,一般都顶个MyCompare表示这是我们自定义的排序规则)
2.在类中重载函数调用符号(),这个重载函数中要有两个参数,这两个参数的类型和set容器中的元素的类型一致(一般将第一个参数命名为v1,第二个参数命名为v2),并且这个重载函数的返回值是bool值
3.在重载函数中书写我们自己的排序规则 --- 其中最基础也是最重要的两个:
如果想从大到小排序 --- return v1 > v2; --- 此时传两个数进来比较,只有v1 > v2的时候返回true,不进行交换,否则返回false,进行交换
如果想从小到大排序 --- return v1 < v2 --- 原理同上
(ps:在此基础上我们也可以使用if,for等语法,来实现更高级的排序规则)
4.将上面这个类的类名作为容器的模板参数之一放入到模板参数列表中
放完后,set容器就会按照这个类中的重载函数中的排序规则进行排序
对于自定义类型数据,我们必须指定一个排序规则之后才能将自定义类型数据插入到set容器中
首先,一个数据会先被排序然后再插入到set容器中,又因为set容器中的内置排序方式都只能够处理c++中的内置数据类型(如Int,double...等等),而无法处理自定义数据类型,所以当我们没有指定排序规则直接插入自定义数据类型的时候,数据会因为无法排序而插入失败
解决这个问题的方法就是用仿函数法自定义一个能够处理自定义数据类型的排序规则,然后再把这个规则指定给set容器