20、关联容器、无序容器

20、关联容器、无序容器

  • 关联容器
    • map
    • multimap
    • set
    • multiset
  • 无序容器
    • 哈希
    • unordered_map

关联容器

map

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

// map的使用
#include <iostream>
#include <map>
#include <stdexcept>
using namespace std;

class Student{
public:
    Student(const string& name="", int age=0):m_name(name),m_age(age){}
private:
    string m_name;
    int m_age;
    friend ostream& operator<<(ostream& os, const Student& stu);
};
ostream& operator<<(ostream& os, const Student& stu){
    return os << stu.m_name << ',' << stu.m_age;
}

void print(map<string,Student>& m){
    typedef map<string,Student>::iterator IT;
    for(IT it = m.begin(); it != m.end(); ++it){
        cout << (*it).first << ':' << (*it).second << endl;
    }
    cout << "-----------------" << endl;
}

int main(void){
    // 创建map
    // 1. 创建空的map
//  map<string, Student> m1;
    // 2. 使用初始化列表指定初始值
    map<string,Student> m2{
        {"1005",{"张飞",25}},
        {"1002",{"赵云",27}},
        {"1010",{"关羽",30}}
    };
/*  print(m2);
    // 3. 用现有容器创建
    map<string,Student> m3{m2};
    print(m3);
    
    map<string,Student> m4{++m2.begin(), --m2.end()};
    print(m4);*/

    // 插入
    m2.insert(pair<string,Student>("1001",Student("刘备",40)));
    m2.insert(make_pair("1011",Student("诸葛亮",35)));
    m2.insert({{"1007",Student("周瑜",28)},{"1003",Student("马超",30)}}); // key存在:什么也不做  key不存在:插入
    m2["1011"] = Student("司马懿",36); // key存在:修改    key不存在:插入
    print(m2);
    
    // 访问
    typedef map<string,Student>::reverse_iterator RIT;
    RIT rit = m2.rbegin();
    cout << "---------使用迭代器获取元素----------" << endl;
    cout << (*rit).first << ':' << (*rit).second << endl;
    cout << "---------使用键获取对应的值-----------" << endl;
//  Student stu = m2["1006"];  // key存在:返回值   key不存在:添加
    try{
        Student stu = m2.at("1006");
    }
    catch(out_of_range& e){
        cerr << e.what() << endl;
        cout << "不存在学号为1006的学生" << endl;
    }
    print(m2);

    // 删除
    cout << "---------根据key删除-----------" << endl;
    if(m2.erase("1006"))
        cout << "1006被删除" << endl;
    else
        cout << "1006不存在" << endl;

    typedef map<string,Student>::iterator IT;
    cout << "---------根据迭代器删除-----------" << endl;
    IT it = m2.erase(m2.begin());
    if(it == m2.end())
        cout << "最后一个元素被删除" << endl;
    else
        cout << "位于" << it->first << "前面的元素被删除" << endl;
    print(m2);

    // 查找
    IT fit = m2.find("1007");
    if(fit == m2.end())
        cout << "1007不存在" << endl;
    else
        cout << "找到1007:" << fit->second << endl;
    return 0;
}


multimap

  • 允许键重复的映射,表示一对多的逻辑关系,不支持下标运算符
  • 定义形式: multimap<键类型,值类型>映射对象
  • 头文件: map
// multimap的使用
#include <iostream>
#include <map>
using namespace std;

int main(void){
    multimap<string,int> m;
    m.insert(pair<string,int>("zhangfei",88));
    m.insert(make_pair("zhaoyun",85));
    m.insert({{"guanyu",70},{"liubei",80}});
    m.insert(pair<string,int>("zhangfei",67)); // 键允许重复
    m.insert(make_pair("zhaoyun",76));
/*
    typedef multimap<string,int>::iterator IT;
    for(IT it=m.begin(); it!=m.end();++it)
        cout << (*it).first << ':' << (*it).second << endl;
*/
    for(const auto& p : m)
        cout << p.first << ':' << p.second << endl;
//  cout << m["zhangfei"] << endl;     // error multimap不支持下标
    return 0;
}

set

  • 没有值只有键的映射
  • 与向量等基本容器相比最大优势就是 排重
  • 定义形式: set<T> 集合对象
  • 头文件: set
// set的使用
#include <iostream>
#include <set>
using namespace std;

int main(void){
    set<int> s;
    s.insert(1);
    s.insert(10);
    s.insert(2);
    s.insert(1);
    s.insert(10);
    s.insert(2);
    s.insert(12);
    s.insert(8);
    s.insert(6);
    cout << "元素数:" << s.size() << endl;  // 6: set中的元素不允许重复

    for(int i: s)
        cout << i << ' ';
    cout << endl;
    return 0;
}

multiset

  • 没有值只有键的多重映射。
  • 定义形式: multiset<T> 多重集合对象
  • 头文件:set
// multiset的使用
#include <iostream>
#include <set>
using namespace std;

int main(void){
    multiset<int> s;
    s.insert(1);
    s.insert(10);
    s.insert(2);
    s.insert(1);
    s.insert(10);
    s.insert(2);
    s.insert(12);
    s.insert(8);
    s.insert(6);
    cout << "元素数:" << s.size() << endl;  // 9: multiset中的元素允许重复

    for(int i: s)
        cout << i << ' ';
    cout << endl;
    return 0;
}

无序容器

哈希

定义

  • 哈希是用给定范围的基本类型的数据项,或者类似string这样的对象,生成整数值的过程
  • 哈希产生的值叫做哈希值或者哈希码,通常用在容器中,用来确定表中对象的位置
  • 理想情况下,每个对象产生的哈希值是唯一的,但实际是可能产生重复的。重复的哈希值称为哈希碰撞
//哈希函数
hash<Key>
template<typename Key> struct hash{}
//成员函数
size_t operator()(Key k){}

unordered_map

在这里插入图片描述

// unordered_map
#include <iostream>
#include <unordered_map>
using namespace std;

class Name{
public:
    Name(const string& forename="",const string& surname=""):m_forename(forename),m_surname(surname){}
    bool operator==(const Name& that)const{
        return m_forename==that.m_forename && m_surname == that.m_surname;
    }
private:
    string m_forename;  // 姓
    string m_surname;   // 名
    friend ostream& operator<<(ostream& os, const Name& name);
    friend class NameHash;
    friend class NameEqual;
};
ostream& operator<<(ostream& os, const Name& name){
    return os << name.m_forename << name.m_surname;
}

// 哈希类
class NameHash{
public:
    size_t operator()(const Name& name)const{
        hash<string> hs;
        return hs(name.m_forename)^(hs(name.m_surname)<<1);
    }
};
// 判等类
class NameEqual{
public:
    bool operator()(const Name& a,const Name& b)const{
        return a.m_forename == b.m_forename && a.m_surname == b.m_surname;
    }
};
int main(void){
    unordered_map<Name,int,NameHash/*,NameEqual*/> um{
        {{"zhang","fei"},88},{{"zhao","yun"},85},{{"guan","yu"},90}
    };

    for(const auto& p : um)
        cout << p.first << ":" << p.second << endl;

/*    
    unordered_map<string,int> um{
        {"zhangfei",88},{"zhaoyun",85},{"guanyu",90}
    };
    cout << um["zhaoyun"] << endl;
    hash<string> hs; // 哈希器
    for(const auto& p : um)
        cout << p.first << "(" << hs(p.first) << ")" << " :" << p.second << endl;
*/  
    return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【计算机网络】TCP socket编程

目录 ​编辑 一、前言 二、概念 1、通信模型&#xff1a; 2、端口&#xff1a; 3、IP地址&#xff1a; 4、协议&#xff1a; 三、简单搭建 1、服务器代码 2、客户端代码 一、前言 Socket&#xff08;套接字&#xff09;是计算机网络中用于实现进程之间通信的一种机制…

Nacos配置管理-微服务配置拉取

yaml已配置内容 目录 一、配置获取步骤 二、统一配置管理步骤 三、Nacos管理配置的步骤总结 一、配置获取步骤 二、统一配置管理步骤 1、引入Nacos的配置管理客户端依赖: <!--nacos配置管理依赖--> <dependency> <groupId>com.alibaba.cloud&l…

企业欠税信息API:实现税务管理的智能化与高效化

前言 随着经济的发展和社会的进步&#xff0c;企业欠税问题逐渐凸显&#xff0c;成为制约经济发展的重要因素。为了解决这一问题&#xff0c;企业欠税信息API应运而生。它通过先进的技术手段&#xff0c;提供了一种全新的欠税信息查询方式&#xff0c;帮助企业实现税务管理的智…

免费的AI改写工具推荐,AI改写工具大全

在本文中&#xff0c;我们将专心分享AI改写的方法、工具以及技巧&#xff0c;旨在帮助大家更好地理解和利用写作利器。我们将揭示AI改写的背后原理&#xff0c;探讨目前市场上主流的AI改写工具&#xff0c;并分享一些提高改写效果的使用技巧。 AI改写的背后技术原理 在深入讨…

阶乘后的零

题目链接 阶乘后的零 题目描述 注意点 返回 n! 结果中尾随零的数量 解答思路 阶乘后有多少个0&#xff0c;取决于乘法计算中有多少个2 * 5&#xff08;只有2 * 5的结果是10有尾随0&#xff09;&#xff0c;又因为在阶乘中2的数量一定多于5的数量&#xff0c;所以阶乘后有多…

AIGC实战——WGAN(Wasserstein GAN)

AIGC实战——WGAN 0. 前言1. WGAN-GP1.1 Wasserstein 损失1.2 Lipschitz 约束1.3 强制 Lipschitz 约束1.4 梯度惩罚损失1.5 训练 WGAN-GP 2. GAN 与 WGAN-GP 的关键区别3. WGAN-GP 模型分析小结系列链接 0. 前言 原始的生成对抗网络 (Generative Adversarial Network, GAN) 在…

PyTorch深度学习实战——人群计数

PyTorch深度学习实战——人群计数 0. 前言1. 人群计数1.1 基本概念1.2 CRSNet 架构 2. 使用 CSRNet 实现人群计数2.1 模型分析2.2 数据集分析2.3 模型构建与训练 相关链接 0. 前言 人群计数是指通过图像或视频分析技术&#xff0c;对给定场景中的人群数量进行估计和统计的过程…

【MATLAB】REMD信号分解+FFT+HHT组合算法

有意向获取代码&#xff0c;请转文末观看代码获取方式~也可转原文链接获取~ 1 基本定义 TVFEMDFFTHHT组合算法是一种结合了总体变分模态分解&#xff08;TVFEMD&#xff09;、傅里叶变换&#xff08;FFT&#xff09;和希尔伯特-黄变换&#xff08;HHT&#xff09;的信号分解方…

多维时序 | MATLAB实现RIME-CNN-LSTM-Multihead-Attention多头注意力机制多变量时间序列预测

多维时序 | MATLAB实现RIME-CNN-LSTM-Multihead-Attention多头注意力机制多变量时间序列预测 目录 多维时序 | MATLAB实现RIME-CNN-LSTM-Multihead-Attention多头注意力机制多变量时间序列预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 MATLAB实现RIME-CNN-…

微信小程序:用map()将对象数组中的某一项组合成新数组

使用分析 使用map()方法来遍历 info 数组中的每个元素&#xff0c;并整合每一个对象中的某一项进行新数组的重组 效果展示 这里是查询对象数组中的全部name值 原始数据 提取出name的数组 核心代码 var infos items.map(item > item.name); 完整代码&#xff08;用微信小程…

基于hadoop下的spark安装

目录 简介 安装准备 spark安装 配置文件配置 简介 Spark主要⽤于⼤数据的并⾏计算&#xff0c;⽽Hadoop在企业主要⽤于⼤数据的存储&#xff08;⽐如HDFS、Hive和HBase 等&#xff09;&#xff0c;以及资源调度&#xff08;Yarn&#xff09;。但是也有很多公司也在使⽤MR2进…

Web server failed to start. Port 8888 was already in use.

端口占用 强制终止占用端口的进程 获取占用端口的进程ID&#xff08;PID&#xff09;&#xff1a;在终端或命令提示符中运行以下命令以查找占用端口的进程ID&#xff1a; ①在 Unix/Linux/Mac 上&#xff1a;lsof -i :8888 ②在 Windows 上&#xff1a;netstat -ano | findstr …

HTML面试题---专题二

文章目录 一、前言二、解释input标签中占位符属性的用途三、如何在 HTML 中设置复选框或单选按钮的默认选中状态&#xff1f;四、表单输入字段中必填属性的用途是什么&#xff1f;五、如何使用 HTML 创建表格&#xff1f;六、解释a标签中目标属性的用途七、如何创建一个点击后会…

Java飞翔的小鸟

一、项目分析 创建一个窗口和画板&#xff0c;把画板放到窗口上&#xff0c;在画板上绘画图片 &#xff08;2&#xff09;让小鸟在画面中动起来&#xff0c;可以上下飞 &#xff08;3&#xff09;让地面和管道动起来 &#xff08;4&#xff09;碰撞检测 &#xff08;5&#xf…

Nginx 优化与防盗链

目录 配置Nginx隐藏版本号 Nginx隐藏版本号的方法 修改配置文件法 修改源码法 修改用户与组 设置缓存时间 日志切割 连接超时 更改进程数 配置网页压缩 配置防盗链 fpm参数优化 总结&#xff1a;nginx优化 配置Nginx隐藏版本号 可以使用 Fiddler 工具抓取数据包&…

【Citespace】从Citespace开始的引文可视化分析

CiteSpace 译“引文空间”&#xff0c;是一款着眼于分析科学分析中蕴含的潜在知识&#xff0c;是在科学计量学、数据可视化背景下逐渐发展起来的引文可视化分析软件。由于是通过可视化的手段来呈现科学知识的结构、规律和分布情况&#xff0c;因此也将通过此类方法分析得到的可…

巧用ChatGPT高效搞定Excel数据分析【文末送书-04】

文章目录 一.巧用ChatGPT高效搞定Excel数据分析1. ChatGPT简介2. 安装所需工具2.1 Python2.2 OpenAI GPT库 3. 与ChatGPT交互进行数据分析4. 利用ChatGPT进行筛选和排序5. ChatGPT的局限性和注意事项6. ChatGPT与数据可视化7. ChatGPT与进阶数据分析任务 二. 结论&文末福利…

Windows安装Maven

一、Maven 是什么&#xff1f; Maven 是一个项目管理和整合工具。Maven 为开发者提供了一套完整的构建生命周期框架。开发团队几乎不用花多少时间就能够自动完成工程的基础构建配置&#xff0c;因为 Maven 使用了一个标准的目录结构和一个默认的构建生命周期。 在有多个开发团…

软件开发安全指南

2.1.应用系统架构安全设计要求 2.2.应用系统软件功能安全设计要求 2.3.应用系统存储安全设计要求 2.4.应用系统通讯安全设计要求 2.5.应用系统数据库安全设计要求 2.6.应用系统数据安全设计要求 软件开发全资料获取&#xff1a;点我获取

用Java实现根据数据库中的数量,生成年月份+序号递增

在日常开发中&#xff0c;经常会遇到根据年月日和第几号文件生成对应的编号&#xff0c;今天给大家提供一个简单的工具类 public static final Long CODE1L;/*** param select 数据库中数据总数* return*/public static String SubjectNo(Long select){// 在总数的基础上1&…