C++ set / multiset 主要包括:《set的介绍与使用》《multiset的介绍和使用》《set与multiset的区别》

如果想看map与multimap的使用,可以点下面的这个链接----》map与multimap的使用《-----

《一》set
首先,我们先如果要使用set的理解的话,就要和之前一样,喜欢查文档,那么我就把set的文档链接,写在下面—》set的文档《—,下面我们就正式进入我们理解,

《1》set的介绍

  1. set是按照一定次序存储元素的容器
  2. 在set中,元素的value也标识它(value就是key,类型为T),并且每个value必须是唯一的。set中的元素
    不能在容器中修改(元素总是const),但是可以从容器中插入或删除它们。
  3. 在内部,set中的元素总是按照其内部比较对象(类型比较)所指示的特定严格弱排序准则进行排序。
  4. set容器通过key访问单个元素的速度通常比unordered_set容器慢,但它们允许根据顺序对子集进行直接迭代。
  5. set在底层是用二叉搜索树(红黑树)实现的。

下面要注意的点是:

  1. 与map/multimap不同,map/multimap中存储的是真正的键值对<key, value>,set中只放value,但在底层实际存放的是由<value, value>构成的键值对。
  2. set中插入元素时,只需要插入value即可,不需要构造键值对。
  3. set中的元素不可以重复(因此可以使用set进行去重)。
  4. 使用set的迭代器遍历set中的元素,可以得到有序序列
  5. set中的元素默认按照小于来比较
  6. set中查找某个元素,时间复杂度为:log2nlog_2 n
  7. set中的元素不允许修改(为什么?)
  8. 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的介绍

  1. multiset是按照特定顺序存储元素的容器,其中元素是可以重复的。
  2. 在multiset中,元素的value也会识别它(因为multiset中本身存储的就是<value, value>组成的键值对,因此value本身就是key,key就是value,类型为T). multiset元素的值不能在容器中进行修改(因为元素总是const的),但可以从容器中插入或删除。
  3. 在内部,multiset中的元素总是按照其内部比较规则(类型比较)所指示的特定严格弱排序准则进行排序。
  4. multiset容器通过key访问单个元素的速度通常比unordered_multiset容器慢,但当使用迭代器遍历时会得到一个有序序列。
  5. multiset底层结构为二叉搜索树(红黑树)。

要注意的是:

  1. multiset中再底层中存储的是<value, value>的键值对
  2. mtltiset的插入接口中只需要插入即可
  3. 与set的区别是,multiset中的元素可以重复,set是中value是唯一的
  4. 使用迭代器对multiset中的元素进行遍历,可以得到有序的序列
  5. multiset中的元素不能修改
  6. 在multiset中找某个元素,时间复杂度为O(log2N)O(log_2 N)
  7. 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是不去重的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章