20、关联容器、无序容器

news2024/11/20 20:28:44

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;
}

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

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

相关文章

【设计模式--结构型--外观模式】

设计模式--结构型--外观模式 外观模式定义结构案例优缺点使用场景 外观模式 定义 又称门面模式&#xff0c;时一种通过多个复杂的子系统提供一个一致的接口&#xff0c;而使这些子系统更加容易被访问的模式。该模式对外有一个统一接口&#xff0c;外部应用程序不用关心内部 子…

大数据机器学习算法项目——基于Django/协同过滤算法的房源可视化分析推荐系统的设计与实现

大数据机器学习算法项目——基于Django/协同过滤算法的房源可视化分析推荐系统的设计与实现 技术栈&#xff1a;大数据爬虫/机器学习学习算法/数据分析与挖掘/大数据可视化/Django框架/Mysql数据库 本项目基于 Django框架开发的房屋可视化分析推荐系统。这个系统结合了大数据…

手写VUE后台管理系统10 - 封装Axios实现异常统一处理

目录 前后端交互约定安装创建Axios实例拦截器封装请求方法业务异常处理 axios 是一个易用、简洁且高效的http库 axios 中文文档&#xff1a;http://www.axios-js.com/zh-cn/docs/ 前后端交互约定 在本项目中&#xff0c;前后端交互统一使用 application/json;charsetUTF-8 的请…

npm run build时提示vue/types/jsx.d.ts中的错误

解决方法一&#xff1a; 可能是因为vue版本过高引起的 我直接将package.json中vue以及vue-template-compiler的版本的前面^去掉&#xff0c;安装指定的版本 注意&#xff1a;vue和vue-template-compiler需要版本一致 参考链接&#xff1a;链接 解决方法二&#xff1a; 如果如…

JavaScript-Window对象

Window对象 BOM&#xff1a;浏览器对象模型 定时器-延时函数 JavaScript内置的一个用来让代码延迟执行的函数&#xff0c;setTimeout setTimeout(回调函数&#xff0c;等待的毫秒数);setTimeout仅仅只执行依次&#xff0c;所以可以理解为就是把一段代码延迟执行&#xff0c…

Pyhon基于YOLOV实现的车辆品牌及型号检测项目源码+模型+项目文档

项目运行运行录屏&#xff1a; Pyhon基于YOLOV实现的车辆品牌及型号检测项目运行录屏 完整代码下载地址&#xff1a;Pyhon基于YOLOV实现的车辆品牌及型号检测项目 项目背景&#xff1a; 车辆检测及型号识别广泛应用于物业&#xff0c;交通等的管理场景中。通过在停车场出入口…

Tomcat从认识安装到详细使用

文章目录 一.什么是Tomact?二.Tomcat的安装1.下载安装包2.一键下载3.打开Tomcat进行测试4.解决Tomcat中文服务器乱码 三.Tomcat基本使用1.启动与关闭Tomcat2.Tomcat部署项目与浏览器访问项目 四.Tomcat操作中的常见问题1.启动Tomcat后&#xff0c;启动窗口一闪而过&#xff1f…

phpstudy小皮(PHP集成环境)下载及使用

下载 https://www.xp.cn/download.html直接官网下载即可&#xff0c;下载完解压是个.exe程序&#xff0c;直接点击安装就可以&#xff0c;它会自动在D盘目录为D:\phpstudy_pro 使用 phpMyAdmin是集成的数据库可视化&#xff0c;这里需要下载一下&#xff0c;在软件管理-》网站程…

pycharm手动安装包

1.下载对应的包 TTS PyPI 2.手动解压&#xff0c;找到文件放到pycharm对应项目的lib文件夹中 以TTS包为例&#xff0c;找到下载并解压的包中的2个文件&#xff0c;一个名称一个info结尾 3.放到项目的lib文件夹中 eg&#xff1a;路径&#xff1b;C:\doc\myProject\speaker\venv…

笔记69:Conv1d 和 Conv2d 之间的区别

笔记地址&#xff1a;D:\work_file\&#xff08;4&#xff09;DeepLearning_Learning\03_个人笔记\4. Transformer 网络变体 a a a a a a a a a a a

12.11_黑马数据结构与算法笔记Java

目录 070 栈 链表实现 概念理清&#xff1a;什么时候是指针的指向&#xff0c;什么时候是元素本身&#xff1f; 071 栈 数组实现 072 栈 e01 有效的括号 072 栈 e02 后缀表达式求值 072 栈 e03 中缀表达式转后缀1 072 栈 e03 中缀表达式转后缀2 072 栈 e03 中缀表达式转…

大文件传输软件和传统软件的优缺点

在当前信息时代&#xff0c;文件和数据的传输已成为我们工作和生活中不可或缺的一环。无论是向同事发送报告还是与朋友分享电影&#xff0c;我们都需要依赖软件完成这些操作。然而&#xff0c;随着文件和数据容量的增大&#xff0c;传统的文件传输软件如FTP、HTTP、SMB、NFS等已…

操作系统内部机制学习

切换线程时需要保存什么 函数需要保存吗&#xff1f;函数在Flash上&#xff0c;不会被破坏&#xff0c;无需保存。函数执行到了哪里&#xff1f;需要保存吗&#xff1f;需要保存。全局变量需要保存吗&#xff1f;全局变量在内存上&#xff0c;无需保存。局部变量需要保存吗&am…

【腾讯云 HAI域探秘】借助高性能服务HAI快速学会Stable Diffusion生成AIGC图片——必会技能【微调】

目录 Stable Diffusion基本使用方法 学术加速测试 配置中文插件 Prompt与Negative prompt 采样器说明 人像生成 水光效果 微调的使用 图像生成种子/seed使用 附加/Extra 微调实例测试 图生图微调 ​编辑 使用蒙版微调 Stable Diffusion基本使用方法 环境配置&am…

2023年【G1工业锅炉司炉】考试及G1工业锅炉司炉作业考试题库

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 G1工业锅炉司炉考试参考答案及G1工业锅炉司炉考试试题解析是安全生产模拟考试一点通题库老师及G1工业锅炉司炉操作证已考过的学员汇总&#xff0c;相对有效帮助G1工业锅炉司炉作业考试题库学员顺利通过考试。 1、【多…

揭秘AI魔法绘画:Stable Diffusion引领无限创意新纪元

文章目录 1. 无限的创意空间2. 高效的创作过程3. 个性化的艺术表达4. 跨界合作的可能性5. 艺术教育的革新6. 艺术市场的拓展 《AI魔法绘画&#xff1a;用Stable Diffusion挑战无限可能》编辑推荐内容简介作者简介精彩书评目录前言/序言本书读者对象学习建议获取方式 随着科技的…

移动端原生实现列表列固定横向滚动功能

功能介绍&#xff1a; 在移动端开发中&#xff0c;会用到列表作为信息展示方式&#xff0c;一般希望上下滚动时&#xff0c;可以固定表头&#xff0c;左右滚动时&#xff0c;可以固定最左列。 需求&#xff1a; 1、列表可以使用数组循环遍历&#xff1b; 2、上下滚动时&…

MISRA C++ 2023:C和C++测试解决方案实现静态分析

自动化软件测试解决方案的全球领导者Parasoft今天宣布&#xff0c;随着Parasoft C/Ctest 2023.2即将发布&#xff0c;全面支持MISRA C 2023。Parasoft针对C和C软件开发的完全集成测试解决方案计划于2023年12月发布&#xff0c;可以帮助团队实现自动化静态分析和编码标准合规性&…

Redis滚动分页的使用

Feed流 关注推送也叫Feed流。通过无限下拉刷新获取新的信息。 Feed流产品常见有两种模式&#xff1a; Timeline: 不做内容筛选&#xff0c;简单的按照内容发布时间排序&#xff0c;常用于好友或关注。例如朋友圈 优点&#xff1a;信息全面&#xff0c;不会有缺失。并且实现也…

JVM 运行时参数

面试题 JVM的参数&#xff0c;你知道的说一下 (百度) 说说你知道的几种主要的JVM参数&#xff08;京东&#xff09; JVM调优调的哪些参数&#xff1f;在哪里写这些参数&#xff1f; &#xff08;亚信&#xff09; 内存调优参数都有什么&#xff1f;&am…