一 . set
1.1 set 是什么、关联/非关联式容器
se是一种关联式容器,主要用进行查找的工作。采用了key模型,判断数据在不在。不支持修改的操作。
序列式容器(线性表):vector / list /deque(单纯存储数据)
关联式容器:map 、 set 、哈希.....(存储数据和数据和数据之间的关系方便查找)
1.2 set的函数
(1)insert
1. 直接输入一个值
插入与节点相同的值时 insert会返回一个 <键值对> <相同key值位置的迭代器,false>(所有数据只能出现一次)。返回值pari<iterator,bool>,pair中定义了两个对象一个是first,一个是second,pair被称为一个键值对。
2. 在某个迭代器的位置插入某个具体的值
3.使用一个迭代器区间进行插入(传输迭代器区间一定是左闭右开的)
(2)erase
1. 删除某个迭代器的位置
2.删除某个具体的值(删除成功返回1,未能成功返回0, 返回的是删除节点的个数)
3.删除一个迭代器区间(传输迭代器区间一定是左闭右开的)
(3)find
find函数如果找到了想要查找元素的位置就返回其迭代器,否则返回end的位置。
(4)lower_bound
lower_bound函数的主要作用是在std::set(或其他有序容器如std::multiset、std::map、std::multimap等)中查找不小于(大于等于)给定值的第一个元素。该函数返回一个迭代器,指向找到的元素;如果没有找到这样的元素,则返回指向容器中最后一个元素之后位置的迭代器(即end()迭代器)。
(5)upper_bound
upper_bound函数用于查找大于给定值的第一个元素。该函数返回一个迭代器,指向找到的元素(如果找到的话,实际上由于查找的是大于给定值的元素,所以返回的迭代器指向的元素是第一个大于给定值的元素,或者如果没有这样的元素,则指向容器末尾之后的位置,即end()迭代器)。
可以用lower_bound 和 upper_bound 来进行定位一个的迭代器区间。
(6)equal_range
用于查找等于给定值的所有元素的范围。它返回一个pair,其中pair.first是一个迭代器,指向第一个大于等于给定值的元素(如果不存在这样的元素,则与end()相同);pair.second是一个迭代器,指向第一个大于给定值的元素(或者,如果没有这样的元素,则也等于end())。
(7)count
cout 函数用于返回一个值在树中出现的次数,对于set来说 只有出现一次和没有出现的情况,可以用来判断某元素在树中是否存在,在的话函数返回1否则返回0。
二.multiset
2.1 multiset 的结构和set的区别
multiset 的容器的作用是允许相同的元素插入到树中,其功能是判断一个元素是否在树中,与set的区别就是multiset允许元素值(key)相同。
(1)find
其中find函数会返回中序遍历到的第一个 需要查询的节点。
(2)erase
erase函数,接收到一个需要删除的值(val)会把树中所有的val都删掉,会有一个size_t类型的返回值 (返回的是删除节点的个数)。
equal_range 函数在multiset中还是比较有用的,可以删除多个相同节点的值,first返回大于等于val 的迭代器的值,second返回大于val迭代器的值,这样的性质正好可以和erase配合使用,删除多个相同的值。
三.map
3.1 map 的结构
采用了k/v型的数据结构,底层是一颗红黑树,其中各个元素的值只能出现一次。
map的迭代器是一个双向迭代器,它不支持sort排序哦。
3.2 单向迭代器、双向迭代器、随机访问迭代器
单向迭代器:支持++
双向迭代器:支持 ++ --
随机访问迭代器:支持 ++ -- + - (你懂我意思吧)
3.3 函数
(1)insert
insert插入时需要插入一个value_type,这是value_type是一个pair的键值对,pair的first是一个key值,second是val值,第一个key是关键字,第二个val是关键字附带的一个val值,key和val的类型可以根据场景来定义。
编译器在一般情况下,觉得每次要插入时都要显示实例化一个pair类型的对象太费劲了,所以我们一般使用make_pair函数来构造出来一个pair键值对。以下是make_pair函数的实现。
make_pair函数是C++标准库中的一个辅助函数,用于创建并返回一个pair对象。pair是一个模板类,它封装了两个值,这两个值可以是不同类型的。make_pair函数简化了pair对象的创建过程,不需要再显示实例化一个pair类型的键值对了,这样使得代码更加简洁。
template<class T1,class T2>
make_pair(T1 key,T2 val)
{
return (pair<T1,T2>(x,y));
}
在insert函数中如果key值在树中已经出现了则不添加节点并且返回一个键值对(first: key已经存在的位置的迭代器,second:false),如果key值在树中没有出现的话那就正常插入并且返回一个键值对(first:刚插入节点的迭代器,second:true)
(2)[ ]
[ ] 在map中是一个非常重要的运算符重载,在[ ] 中写一个key值 ,会得到一个key对应的val值的引用。如果在[ ] 中写了一个不存在的key值,那么编译器会在map中自动添加这个key值和val值。
[ ] 底层是用insert 函数来实现的,因为在使用insert函数时,如果key值在树中已经出现了则不添加节点并且返回一个键值对(first: key已经存在的位置的迭代器,second:false),如果key值在树中没有出现的话那就正常插入并且返回一个键值对(first:刚插入节点的迭代器,second:true)
[ ] 就相当于调用这个函数
这个函数就相当于