C++学习笔记:set和map

news2024/9/22 23:17:00

set和map

  • set
    • 什么是set
    • set的使用
  • 关联式容器
    • 键值对
  • map
    • 什么是map
    • map的使用
      • map的插入方式
      • 常用功能
      • map[] 的灵活使用

set

什么是set

set是STL中一个底层为二叉搜索树来实现的容器

  • 若要使用set需要包含头文件 #include<set>
  • set中的元素具有唯一性(因此可以用set去重)
  • 若用set的迭代器遍历,默认得到升序序列
  • set查找某个元素默认复杂度为 l o g 2 N log_2 N log2N
  • set中的元素不能被修改

set的使用

set<int> s; //默认升序
set<int , greater<int>>  us; //降序
int i;
    s.insert(i);  //插入值 若成功,则返回i所在迭代器,若失败,则返回已存在的i的迭代器
    s.erase(i);  //删除某个值 并 返回所删除的个数
    s.clear();  //清空s
    s.begin();  //begin迭代器
    s.end();  //end()迭代器
    s.find(i);  //查找i,若找到了,则返回i的迭代器,若没找到,返回尾部迭代器 s.end();
    s.empty();  //返回s是否为空
    s.size();  //返回s内元素个数

用例:

#include<iostream>
#include<set>

using namespace std;

int main()
{
	set<int> s;

    s.insert(1);
    s.insert(3);
    s.insert(2);
    s.insert(4);
    s.insert(5);
    s.insert(1);  //插入第二个1

    //这里用了范围for ,因为右迭代器,因此自动遍历
    for (auto& e : s)
    {
        cout << e << " ";
    }
    cout << endl;   //遍历结果: 1 2 3 4 5

    //删除3再遍历  set会自动调整
    s.erase(3);
    for (auto& e : s)
    {
        cout << e << " ";
    }
    cout << endl;   //遍历结果: 1 2 4 5

    //清理s
    s.clear();
    for (auto& e : s)
    {
        cout << e << " ";
    }
    cout << endl; //空值

    set<int, greater<int>>  us; //降序set
    //插入:
    us.insert(1);
    us.insert(2);
    us.insert(3);
    us.insert(4);
    us.insert(5);

    //遍历
    for (auto& e : us)
    {
        cout << e << " ";
    }
    cout << endl;  //遍历结果为降序: 5 4 3 2 1
	return 0;
}

在这里插入图片描述

关联式容器

之前学习的容器中,基本都是单元素存储,比如:vector、list、deque、等,这些容器统称为序列式容器,因为其底层为线性序列的数据结构,里面存储的是元素本身。即 K 模型 的容器
关联式容器也是用来存储数据的,与序列式容器不同的是,其里面存储的是<key, value>结构的键值对,在数据检索时比序列式容器效率更高
例如上面的set也是关联式容器,set中只放value,但在底层实际存放的是由<value, value>构成的键值对

键值对

用来表示具有一一对应关系的一种结构,该结构中一般只包含两个成员变量key和value,key代表键值,value表示与key对应的信息.即 KV 模型 的容器
在这里插入图片描述

STL中键值对的定义:

template <class T1, class T2>
struct pair
{
typedef T1 first_type;
typedef T2 second_type;
T1 first;
T2 second;
pair(): first(T1()), second(T2())
{}
pair(const T1& a, const T2& b): first(a), second(b)
{}
};

map

什么是map

一种存储键值对,底层为二叉搜索树的数据结构

  • 需要包含头文件#include<map>
  • map是关联容器,它按照特定的次序(按照key来比较)存储由键值key和值value组合而成的元素。即 KV 模型
  • 在map中,键值key通常用于排序和惟一地标识元素,而值value中存储与此键值key关联的内容。键值key和值value的类型可能不同,并且在map的内部,key与value通过成员类型value_type绑定在一起,为其取别名称为pair:
    typedef pair<const key, T> value_type 其中,key为const,因此是不能修改的,而T是可以修改的
  • map中的元素按照键值key进行比较排序
  • map支持下标访问,即在[]中放入key,就可以找到与key对应的value。
  • map底层实际上就是二叉搜索树(更准确的说:平衡二叉搜索树(红黑树))。

map的使用

先创建一个map对象:

map<string, string> m;

map的插入方式

几种常见的map插入方式:

    m.insert(make_pair("left", "左边"));
    m.insert(pair<string, string>("right", "右边"));
    m["insert"] = "插入";
  1. 因为map中存储的是键值对元素,因此每次插入的时候应该使用pair函数
    m.insert(pair<string, string>("right", "右边"));
    但是这种方法有点麻烦,因此引用了make_pair函数

  2. make_pair是一个仿函数,定义如下:
    返回值还是一个pair键值对:
    在这里插入图片描述
    因此当map插入值的时候可以使用以下方法:
    m.insert(make_pair("left", "左边"));
    这种方式是最常用的

  3. 因为map重载了[],因此可以直接使用[]来进行插入
    map中operator[]的原理是:

  • 用<key, T()>构造一个键值对,然后调用insert()函数将该键值对插入到map中
  • 如果key已经存在,插入失败,insert函数返回该key所在位置的迭代器
  • 如果key不存在,插入成功,insert函数返回新插入元素所在位置的迭代器
  • operator[]函数最后将insert返回值键值对中的value返回
    m["insert"] = "插入";
    其中,[]内为 K 值, 返回的V被 = 后的内容赋值;

常用功能

    m.insert(make_pair("erase", "删除"));  //插入值 若已存在,则返回该值的迭代器
    m.erase("erase");  //删除值
    m.clear();  //清除map
    m.size();  //返回 K 元素的数量
    m.begin();  //begin迭代器
    m.end();  //end迭代器
    m.find("erase");  //查找 K 值,若找到了,则返回迭代器, 若没找到,则返回迭代器m.end()
    m["find"];  //插入K ,若有
    m.swap(m2);  //交换两个map对象 其中m2 为另一个与m对象同类型的对象

map[] 的灵活使用

map因为重载了[] ,因此变得非常灵活,例如,统计下列数组中相同的值出现的次数:

#include<iostream>
#include<string>
#include<map>

using namespace std;

int main()
{
    string arr[] = { "西瓜","西瓜", "西瓜", "西瓜",
                    "苹果","苹果","苹果","苹果","苹果","苹果",
                    "香蕉","香蕉","香蕉","香蕉",
                    "草莓","草莓","草莓","草莓","草莓","草莓","草莓", };
    map<string, int> m;
    for (auto& e : arr)
    {
        m[e]++; //这里直接利用[]对m进行插入,并通过++ 对V值进行控制
    }
    for (auto& e : m)
    {
        cout << e.first << ":" << e.second << endl;
    }

	return 0;
}

输出结果:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1488589.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux高级编程:进程间的通信(二)、IPC

回顾 共7种方式&#xff1a; 古老的进程间通信方式&#xff1a; 管道&#xff1a; 无名管道 有名管道 信号 系统V IPC进程对象 共享内存 消息队列 信号量集 socket通信 //网络 ------------------------- 无名管道 pipe&#xff08;&#xff09; 特点&#xff1a; 用于…

CSS3笔记

1.相同优先级的样式以写在后面的为主。 2.交集选择器&#xff0c;并且 条件挨在一起 p.rich{...} /*p元素class有rich的元素*/ 3.并集选择器&#xff0c;或者 逗号隔开 .class1,class2{...}/*满足其中一个类名都会使用该样式*/ 4.后代选择器 空格 隔开 所有符合的包括孙子及…

揭秘App访问量背后的秘密:数据统计与分析

在移动互联网时代&#xff0c;App已成为人们日常生活的重要组成部分。对于App运营者来说&#xff0c;了解用户的访问量、行为习惯等数据至关重要。本文将深入探讨如何精准统计App访问量&#xff0c;为运营者提供有价值的数据支持。 一、App访问量统计的重要性 访问量是衡量A…

2024年【焊工(初级)】找解析及焊工(初级)考试技巧

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 焊工&#xff08;初级&#xff09;找解析是安全生产模拟考试一点通生成的&#xff0c;焊工&#xff08;初级&#xff09;证模拟考试题库是根据焊工&#xff08;初级&#xff09;最新版教材汇编出焊工&#xff08;初级…

【EAI 027】Learning Interactive Real-World Simulators

Paper Card 论文标题&#xff1a;Learning Interactive Real-World Simulators 论文作者&#xff1a;Mengjiao Yang, Yilun Du, Kamyar Ghasemipour, Jonathan Tompson, Leslie Kaelbling, Dale Schuurmans, Pieter Abbeel 作者单位&#xff1a;UC Berkeley, Google DeepMind, …

leetcode 移除链表元素

本题中&#xff0c;我们是要移除链表的某一个节点&#xff0c;为了确保统一操作&#xff0c;我们需要使用虚拟头节点&#xff0c;这样我们删除节点的时候&#xff0c;就是把这个要删除的节点&#xff08;当前节点cur&#xff09;的前一个节点pre&#xff0c;使得pre.next指向要…

jsp阿帕奇安装教程

1.将压缩包解压&#xff0c;存放在自己所知道的位置 2.将软件文件夹打开 使用winr &#xff0c;输入cmd运行打开 输入Java或者Javac&#xff0c;出现一大串之后表明成功 接着在所解压的软件中点开bin这个文件夹&#xff0c;找到startup.bat点击 点击之后会出现黑框&#xff0c…

Linux中断实验:定时器实现按键消抖处理

一. 简介 前面文章学习了Linux驱动按键中断实验,文章地址如下: Linux驱动按键中断实验:按键中断功能的实现-CSDN博客 本文在Linux驱动按键中断实现的基础上,使用定时器实现按键消抖处理。 二. Linux中断实验:定时器实现按键消抖处理 1. 定时器处理按键消抖的原理 按…

java使用poi、ftl将html导出word,设置视图为 页面视图

1、修改html标签&#xff0c; 加入如下内容 <html xmlns:v"urn:schemas-microsoft-com:vml" xmlns:o"urn:schemas-microsoft-com:office:office" xmlns:w"urn:schemas-microsoft-com:office:word" xmlns:m"http://schemas.microsoft.c…

【NCRE Python】

基本输入输出函数 input 函数 input 函数用于从标准输入&#xff08;如键盘&#xff09;接收用户输入的字符串。当 input 函数被调用时&#xff0c;程序会暂停执行&#xff0c;等待用户输入文本并按回车键。用户输入的文本会作为字符串返回给程序。input 函数还可以接收一个字…

【笔记版】docker常用指令---systemctl类、docker状态

systemctl [options] docker 启动&#xff1a;system start docker查看状态&#xff1a;systemctl status docker停止&#xff1a;systemctl stop docker有警告&#xff1a;service关闭了&#xff0c;但是docker.socket仍响应解决方法&#xff1a;systemctl stop docker.socket…

OSError: [WinError 1455] 页面文件太小,无法完成操作。

[问题描述]&#xff1a;OSError: [WinError 1455] 页面文件太小&#xff0c;无法完成操作。 原因1&#xff1a;线程数太大 方法&#xff1a;改小线程&#xff08;workers&#xff09;数。 原因2&#xff1a;虚拟内存太小或为0&#xff0c;调大虚拟内存。 方法&#xff1a;右键…

SL3036 DC100V降压5V 2A 低功耗 性价比低 替代MP9486A

SL3036 DC100V降压5V 2A是一款常用的电源管理芯片&#xff0c;它能够将较高的输入电压降至较低的输出电压&#xff0c;为电子设备提供稳定可靠的电源供应。其低功耗、高性价比的特点使得它在许多领域得到了广泛的应用。然而&#xff0c;对于一些对成本敏感的应用来说&#xff0…

Linux——MySQL主从复制与读写分离

实验环境 虚拟机 3台 centos7.9 网卡NAT模式 数量 1 组件包mysql-5.6.36.tar.gz cmake-2.8.6.tar.gz 设备 IP 备注 Centos01 192.168.223.123 Amoeba Centos02 192.168.223.124 Master Centos03 192.168.223.125 Slave MySQL安装 主从同时操作 安装所需要的…

SG11加密,屠龙少年最终变成了恶龙

加密只是一种手段&#xff0c;不应该成为收割工具&#xff0c;最近收到2个客户询盘&#xff0c;结果都是因为代码被加密无法提供服务&#xff0c;无奈放弃。 sg11加密的初衷是为了防止客户不遵守契约衍生出来的方案&#xff0c;没想到屠龙少年最终变成了恶龙。第一个客户因为服…

【知识整理】Git 使用实践问题整理

问题1、fatal: refusing to merge unrelated histories 一、Git 的报错 fatal: refusing to merge unrelated histories 新建了一个仓库之后&#xff0c;把本地仓库进行关联提交、拉取的时候&#xff0c;出现了如下错误&#xff1a; fatal: master does not appear to be a g…

MYSQL---日志

1.日志的概述 日志是MySQL数据库的重要组成部分。日志文件中记录着MySQL数据库运行期间发生的变化&#xff1b;也就是说用来记录MySQL数据库的客户端连接状况、SQL语句的执行情况和错误信息等。当数据库遭到意外的损坏时&#xff0c;可以通过日志查看文件出错的原因&#xff0…

QUIC来了!

什么是QUIC QUIC&#xff0c;快速UDP网络连接(Quick UDP Internet Connection)的简称&#xff0c;即RFC文档描述它为一个面向连接的安全通用传输协议。其基于UDP协议实现了可靠传输及拥塞控制&#xff0c;简单来说&#xff0c;QUIC TCP TLS。 为什么有了QUIC HTTP2.0为了为了…

京津冀国际光伏展

京津冀国际光伏展是一个国际性的光伏展览会&#xff0c;旨在推动京津冀地区光伏产业的发展&#xff0c;促进国内外光伏技术的交流与合作。展览会通常包括展览展示、技术交流、高层论坛等环节&#xff0c;吸引了来自全球各地的光伏企业、科研机构、行业专业人士等参观和参与。 京…