C++:主要的关联式容器类型:set

2023-11-17

目录

1.关联式容器

2.键值对

3.树形结构的关联式容器

4.set

5.set的特点

6.set的使用

常用接口的使用:

1.insert

2.find

 3.erase

4.operator=

7.multiset


1.关联式容器

与vector,list,queue等底层为线性序列的数据结构的序列式容器有着不同,关联式容器里面存储的是<key, value>结构的键值对,在数据检索时比序列式容器效率更高。与之相对,序列式容器中的元素是按照它们在容器中的位置来顺序保存和访问的。

2.键值对

用来表示具有一一对应关系的一种结构,该结构中一般只包含两个成员变量key和value,key代
表键值,value表示与key对应的信息。比如:以一个人的名字为key值,再将他的手机号当作value值,这样我们就可以通关一个人的名字找到他对应的手机号。

3.树形结构的关联式容器

树形结构的关联式容器主要有四种:map, set, multimap, multiset。这四种容器的共同点是:使用平衡搜索树(红黑树)作为其底层结果,容器中的元素是一个有序的序列。

以下将主要介绍set容器。

4.set

T             :set中存放元素的类型,实际在底层存储<value,value>的键值对。

Compare :set中元素默认按照小于来比较。

Alloc        :set中元素空间的管理方式,使用STL提供的空间配置器管理。

 

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中查找某个元素,时间复杂度为:\log_{2}N

7. set中的元素不允许修改,但是可以从容器中插入或删除它们。。

8. set中的底层使用二叉搜索树(红黑树)来实现。

6.set的使用

常用接口的使用:

1.insert

range:[first,last) 范围包含first和last之间的所有元素,包括first指向的元素,但不包括last指向的元素。

因为set中的元素都是唯一的,所以插入操作会检查每个插入的元素是否与容器中已经存在的元素相等,如果相等,则不插入该元素,并返回该元素的迭代器(如果该函数有返回值)。

在内部,设置容器将其所有元素按照其比较对象指定的标准排序(默认按照小于)。元素总是按照这种顺序插入到其各自的位置。

#include <iostream>
#include <set>
using namespace std;
int main()
{
    set<int> myset;
    set<int>::iterator it;
    pair<std::set<int>::iterator, bool> ret;

    // 设置初始值
    for (int i = 1; i <= 5; ++i) myset.insert(i * 10);  // set: 10 20 30 40 50

    ret = myset.insert(20);               // 已有20,则不再插入,返回该元素迭代器

    if (ret.second == false) it = ret.first;  // it现在指向元素20

    myset.insert(it, 25);                 // 最高效率插入
    myset.insert(it, 24);                 // 最高效率插入
    myset.insert(it, 26);                 // 未最高效率插入(默认按小于)

    int myints[] = { 5,10,15 };              // 10已经在则不插入
    myset.insert(myints, myints + 3);

    cout << "myset contains:";
    for (it = myset.begin(); it != myset.end(); ++it)
        std::cout << ' ' << *it;
    cout << endl;

    return 0;
}

2.find

在容器中搜索与val相等的元素,如果找到就返回一个指向该元素的迭代器,否则返回一个迭代器set::end。

#include <iostream>
#include <set>
using namespace std;
int main()
{
    set<int> myset;
    set<int>::iterator it;

    // 设置初始值
    for (int i = 1; i <= 5; i++) myset.insert(i * 10);  // set: 10 20 30 40 50

    it = myset.find(20);
    myset.erase(it);
    myset.erase(myset.find(40));

    cout << "myset contains:";
    for (it = myset.begin(); it != myset.end(); ++it)
        cout << ' ' << *it;
    cout << endl;

    return 0;
}

 3.erase

 从set容器中移除单个元素或一系列元素[first,last)。

range:[first,last)该范围包括first和last之间的所有元素,包括first指向的元素,但不包括last指向的元素。

#include <iostream>
#include <set>
using namespace std;
int main()
{
    set<int> myset;
    set<int>::iterator it;

    // 插入一些值
    // 10 20 30 40 50 60 70 80 90
    for (int i = 1; i < 10; i++) myset.insert(i * 10);

    it = myset.begin();
    ++it;                                         // "it" 现在指向元素20

    myset.erase(it);

    myset.erase(40);

    it = myset.find(60);
    myset.erase(it, myset.end());

    std::cout << "myset contains:";
    for (it = myset.begin(); it != myset.end(); ++it)
        cout << ' ' << *it;
    cout << endl;

    return 0;
}

4.operator=

将新内容赋值给容器,替换当前内容。

#include <iostream>
#include <set>
using namespace std;
int main()
{
	int myints[] = { 12,82,37,64,15 };
	set<int> first(myints, myints + 5);   // 用5个整数设置
	set<int> second;                    // 空集

	second = first;                          // 现在second包含5个整数
	first = set<int>();                 // first变为空

	cout << "Size of first: " << int(first.size()) << endl;
	cout << "Size of second: " << int(second.size()) << endl;
	return 0;
}

7.multiset

1. multiset是按照特定顺序存储元素的容器,其中元素是可以重复的。

2. 在multiset中,元素的value也会识别它(因为multiset中本身存储的就是<value, value>组成
的键值对,因此value本身就是key,key就是value,类型为T). multiset元素的值不能在容器
中进行修改(因为元素总是const的),但可以从容器中插入或删除。

3. 在内部,multiset中的元素总是按照其内部比较规则(类型比较)所指示的特定严格弱排序准则
进行排序。

4. multiset容器通过key访问单个元素的速度( \log_{2}N)通常比unordered_multiset容器慢,但当使用迭
代器遍历时会得到一个有序序列。

5. multiset底层结构为二叉搜索树(红黑树)。

注意:multiset与set的区别是multiset中的元素可以重复。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++:主要的关联式容器类型:set 的相关文章

随机推荐

  • Java后端项目实现无限极树 - 案例:部门树 - Department实体类

    1 domain层
  • java找不到符号解决办法

    一 java找不到符号 如果你的代码里没有报错 明明是存在的 但是java报错找不到符号 像下面这样子 二 解决步骤 1 清除编码工具缓存 本人用的idea eclipse清除缓存方式有需要的可以百度一下 2 如果是mavne项目的 先cl
  • 编程艺术 - 第一章 左旋转字符串

    题目 定义字符串的左旋转操作 把字符串前面的若干个字符移动到字符串的尾部 若把字符串abcdef左旋转2位得到字符串cdefab 请实现字符串左旋转的函数 要求对长度为n的字符串操作的时间复杂度为O n 空间复杂度为O 1 类似题目还有剑指
  • 【算法】Shell排序--C++源代码(VS2015)

    include
  • tensorflow导入错误“ImportError: DLL load failed”(已解决)

    毕业论文需要用到tensorflow 然鹅我却卡在了安装 由于各种问题还自身的拖延症与它 斗争 了一周 终于安装成功了 我一定要记录下来这血泪史 这篇笔记也拖了好几天 如果你也遇到下面的问题 就继续往下看吧 直接 pip install t
  • Docker网络理解(1)

    2017 02 17 我注意到 很多大型的企业公司在提供云计算服务的时候 必然要对各个不同的租户进行隔离 这就和OpenStack一样了 需要一个网络拓扑的设计 所以前面对网络的理解是很有用的 后续对这个隔离应用来说 我所知道的就是用OVS
  • 记一次windows下Netty做为压测端引发的错误 No buffer space available (maximum connections reached?): bind

    最近写了个客户端压测工具结果每次压到将近5000时就会报错 也是搞了两天才发现问题 主要是错误表现和网上大多数人的表现一样 导致忽略了眼前的错误提示 错误表现具体如下 java lang IllegalStateException fail
  • 兔队线段树:楼房重建

    https www luogu com cn problem P4198 本质 在线段树上每个节点维护信息时再深入到底部 加个 log log log O n
  • Promise,async,await

    什么是Promise Promise 简单说就是一个容器 里面保存着某个未来才会结束的事件 通常是一个异步操作 的结果 从语法上说 promise是一个对象 从它可以获取异步操作的的最终状态 成功或失败 Promise是一个构造函数 对外提
  • 轨迹相似性度量方法总结

    轨迹相似性度量方法总结 基于点的度量 基于形状的度量 基于分段 基于特定任务 基于点的度量 1 欧氏距离 优点 线性计算时间 缺点 轨迹长度要相同 2 DTW 是对时间序列距离测量的改进 优点 考虑到时间差 比欧式距离效果好 缺点 对噪音比
  • C++(17)——智能指针初步及弃用auto_ptr的原因

    RAII 使用局部对象来管理资源的技术 RAII的原理 RAII的四个步骤 裸指针存在的问题 delete后的指针变量就变成了一个失效指针 也叫作悬空指针 对于下面的代码 void Destroy Object op delete op d
  • 无源波分和彩光模块_甘肃移动2020~2022年无源波分设备及光模块集采结果:迅特、绍兴中科中标...

    据CFOL从中国移动招标与采购网上了解 上周五 甘肃移动公开2020 2022年无源波分设备及光模块集采结果 该项目于10月份启动招标 历时1个月 集采产品分为无源波分设备及光模块两类 项目分为标包1及标包2 各标包3家企业中标 2家中标1
  • android监控view高度变化,Android-获取View宽高的时机

    前言 最近遇到一个bug 问题描述是这样的 启动页需要放置一张广告图 要使这张图在不变形的情况下 等比例缩放 宽度要占满屏幕宽 于是手动计算并设置ImageView需要的缩放比例来对图片进行缩放 该方法触发的时机引发了一些问题 privat
  • ReferenceError: XXX is not defined 错误及解决办法

    ReferenceError XXX is not defined 错误及解决办法 我这里报错是忘记了引入此方法所在的js文件 解决办法 引入所需的js文件 此错误 另外一种情况就是 jQuery引入先后顺序不对 要先引入jQuery文件
  • emmc学习

    1 介绍 1 1 简介 emmc embedded multi media card eMMC的一个明显优势是在封装中集成了一个控制器 它提供标准接口并管理闪存 使得手机厂商就能专注于产品开发的其它部分 并缩短向市场推出产品的时间 这些特点
  • pikachu之文件下载和文件上传

    目录 一 文件下载 1 复制这个下载文件地址 2 尝试去下载这个down nba php 3 目录扫描工具 二 文件上传 1 checkclient 1 利用burp suite 2 关闭js 3 修改页面源代码 2 mime类型验证 3
  • IO多路复用机制详解

    高性能IO模型浅析 服务器端编程经常需要构造高性能的IO模型 常见的IO模型有四种 1 同步阻塞IO Blocking IO 即传统的IO模型 2 同步非阻塞IO Non blocking IO 默认创建的socket都是阻塞的 非阻塞IO
  • 机器学习模型融合

    模型融合方式 均值法Averaging 适用于回归类算法 将每个评估器的输出做平均 类似于Bagging中回归的做法 投票法Voting 适用于分类算法 将每个评估器的输出进行投票 类似于Bagging中分类的做法 堆叠法Stacking
  • heapdump文件找相关的键值

    前言 一次做项目遇到heapdump文件 也是第一次碰到所以记录一下过程 步骤 下载heapdump文件是一个 hprof gz后缀的文件 使用MemoryAnalyzer这个工具就可以进行对其中的键值进行分析 工具的安装 下载好Memor
  • C++:主要的关联式容器类型:set

    目录 1 关联式容器 2 键值对 3 树形结构的关联式容器 4 set 5 set的特点 6 set的使用 常用接口的使用 1 insert 2 find 3 erase 4 operator 7 multiset 1 关联式容器 与vec