set的使用

一、关联式容器

在之前的学习中,我们都接触了不少容器,如vector、list、deque等容器,这些容器统称为 序列式容器。而stack和queue是靠deque适配出来的,之前我们也模拟实现了,所以stack和queue是 容器适配器。今天我们还要学习一种容器:关联式容器,其中set、multiset、map和multimap都叫做 关联式容器,下面重点学习 set和multiset

关联式容器也是用来存储数据的,与序列式容器不同的是,其里面存储的是 <key, value>结构的键值对,在数据检索时比序列式容器效率更高。

所以容器分为三种类型:序列式容器、关联式容器、容器适配器

二、set

1、set的介绍

image-20241221140639647

这是set的模板参数列表:

T:set中存放元素的类型,实际上在底层是<value, value>的键值对。
Compare:默认是使用小于来比较的。(可以使用仿函数修改)
Alloc:set中元素空间管理的方式,使用allocator空间配置器管理。

它的底层是**平衡二叉搜索树(红黑树)**实现的,后续我们会模拟实现。

2、set的使用

2.1、元素的插入(insert接口)

image-20241221141538705

insert插入元素一共有三种方式

①直接插入一个元素

②在迭代器的位置插入一个元素

③使用范围插入函数

#include <iostream>
#include <set>
using namespace std;
int main()
{
   
   
	set<int> myset;
	myset.insert(3);
	myset.insert(5);
	myset.insert(3);
	myset.insert(1);
	myset.insert(1);
	myset.insert(7);

	set<int>::iterator it = myset.begin();
	while (it != myset.end())
	{
   
   
         // *it = 1;     set中是不允许修改的 
		cout << *it << " ";
		it++;
	}
	return 0;
}

结果:image-20241221142512228

可以看到这里我们插入的元素是[3, 5, 3, 1, 1, 7],但是打印出来的值是[1, 3, 5, 7]。

image-20241221143206587

很明显,set是**去重+排序**的,保证了set中的元素是唯一的,这就是set的特性。

而且set同样是支持迭代器,你可以使用迭代器或者范围for来访问容器中的元素。

image-20241221143548181

对于set中的元素为什么不能修改?

  • set的元素是唯一的,如果你进行修改,保不齐你修改的元素正好set中就有的。
  • 修改了元素,不能保证set还是有序的,那么就必须重新调整树,这样效率是非常低的。
2.2、pair的简单讲解

官方文档说的很清楚,insert是有个返回值的:pair<iterator, bool>,这个是什么呢?这其实就是键值对,常常说的<K, V>就是键值对关系。

pair的源码中显示,它就是一个类。我们可以调用first和second来访问这个键值对。

template <class T1, class T2>
    struct pair
    {
   
   
        typedef T1 first_type;
        typedef T2 second_type;
        T1 first;
        T2 second;
        pair(): first(T1()), second(T2())
        {
   
   
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值