如果想看map与multimap的使用,可以点下面的这个链接----》map与multimap的使用《-----
《一》set
首先,我们先如果要使用set的理解的话,就要和之前一样,喜欢查文档,那么我就把set的文档链接,写在下面—》set的文档《—,下面我们就正式进入我们理解,
《1》set的介绍
- set是按照一定次序存储元素的容器
- 在set中,元素的value也标识它(value就是key,类型为T),并且每个value必须是唯一的。set中的元素
不能在容器中修改(元素总是const),但是可以从容器中插入或删除它们。 - 在内部,set中的元素总是按照其内部比较对象(类型比较)所指示的特定严格弱排序准则进行排序。
- set容器通过key访问单个元素的速度通常比unordered_set容器慢,但它们允许根据顺序对子集进行直接迭代。
- set在底层是用二叉搜索树(红黑树)实现的。
下面要注意的点是:
- 与map/multimap不同,map/multimap中存储的是真正的键值对<key, value>,set中只放value,但在底层实际存放的是由<value, value>构成的键值对。
- set中插入元素时,只需要插入value即可,不需要构造键值对。
- set中的元素不可以重复(因此可以使用set进行去重)。
- 使用set的迭代器遍历set中的元素,可以得到有序序列
- set中的元素默认按照小于来比较
- set中查找某个元素,时间复杂度为: l o g 2 n log_2 n log2n
- set中的元素不允许修改(为什么?)
- set中的底层使用二叉搜索树(红黑树)来实现。
《1.1》set的使用
在使用之前我们先看一下在文档里面,我们有什么常用的接口,大家可以打开上面的文档是一样的,这里我就举例一下,让大家看一下,文档里面是什么,看下面的部分接口。
点开文档里面就会是这些文档,随便点开,里面是介绍函数的使用,库什么的,可以看一看,下面,我们就大概使用一下,因为之前的很多接口,我们在前面的list/vector/string/都是用过了。
我们看下面的一段代码
#include<set>
void test_set()
{
set<int> s;
s.insert(1);
s.insert(5);
s.insert(5);
s.insert(3);
s.insert(5);
s.insert(5);
s.insert(4);
s.insert(5);
s.insert(2);
s.insert(5);
set<int>::iterator it = s.begin(); //迭代器使用
while (it != s.end())
{
cout << *it<<" ";
++it;
}
cout << endl;
for (auto e : s) //范围for
{
cout << e << " ";
}
cout << endl;
auto it1 = find(s.begin(), s.end(), 5); //O(N)
auto it2 = s.find(5); //O(logN)
}
int main()
{
test_set();
return 0;
}
下面我们看一下程序的执行结果:
我们由程序的结果可以看出,set是支持迭代器和范围for的,并且又排好了序,很方便,最重要的是,他还去了重,就是代码中,重复出现的5。我们可以看到文档里面还有很多的接口,但是我们这里就先说这么多,后面我们就看看map,因为在后面实现二叉搜索树,AVL树,红黑树的时候,还要使用到呢,不用着急。——搜索树的key不允许改。
《二》multiset
《1》multiset的介绍
- multiset是按照特定顺序存储元素的容器,其中元素是可以重复的。
- 在multiset中,元素的value也会识别它(因为multiset中本身存储的就是<value, value>组成的键值对,因此value本身就是key,key就是value,类型为T). multiset元素的值不能在容器中进行修改(因为元素总是const的),但可以从容器中插入或删除。
- 在内部,multiset中的元素总是按照其内部比较规则(类型比较)所指示的特定严格弱排序准则进行排序。
- multiset容器通过key访问单个元素的速度通常比unordered_multiset容器慢,但当使用迭代器遍历时会得到一个有序序列。
- multiset底层结构为二叉搜索树(红黑树)。
要注意的是:
- multiset中再底层中存储的是<value, value>的键值对
- mtltiset的插入接口中只需要插入即可
- 与set的区别是,multiset中的元素可以重复,set是中value是唯一的
- 使用迭代器对multiset中的元素进行遍历,可以得到有序的序列
- multiset中的元素不能修改
- 在multiset中找某个元素,时间复杂度为 O ( l o g 2 N ) O(log_2 N) O(log2N)
- multiset的作用:可以对元素进行排序
《1.2》multiset的使用
和上面一样,我们先看一下—》multiset文档《—查看里面的内容,
下来我们就看下面的一段代码,来了解一下multiset的使用,:
void test_multiset()
{
multiset<int> s;
s.insert(4);
s.insert(3);
s.insert(4);
s.insert(2);
s.insert(4);
s.insert(5);
s.insert(4);
s.insert(1);
s.insert(4);
multiset<int>::iterator it = s.begin();
while (it != s.end())
{
cout << *it << " ";
++it;
}
cout << endl;
it = s.find(2);
cout << *it << endl;
++it;
cout << *it << endl;
++it;
}
int main()
{
// test_set();
test_multiset();
return 0;
}
这里的使用其实和set是一样的,就是结果他是不一样,下面,我们看一下程序的执行结果;
由执行结果,我们可以看出**,multiset是没有去重的,而set它是去重的**,个有个的好处,下面,我们还要说出他们的去别的,这里主要就要记住,set是去重的,multiset是不去重的。