set、map容器

news2024/9/25 19:17:40

一、set

1. set基本概念

简介:
所有元素都会在插入时自动被排序
本质:
set/multiset属于关联式容器,底层结构是用二叉树实现。
set和multiset区别:
set不允许容器中有重复的元素

multiset允许容器中有重复的元素

2. set构造和赋值

构造:
set<T> st;                  //默认构造函数:
set(const set &st);     //拷贝构造函教
赋值:
set& operator=(onst set &st);       //重载等号操作符

//打印
void PrintSet(const set<int>& s) {
    for (set<int>::const_iterator it = s.begin(); it != s.end(); it++) {
        cout << *it << "  ";
    }
    cout << endl;
}
void test494533()
{
    set<int> s1;
    //插入数据只有insert方式
    // set容器特点:所有元素插入时候自动被排序
    // set容器不允许插入重复值
    s1.insert(123);
    s1.insert(25);
    s1.insert(33);
    s1.insert(63);
    //打印
    PrintSet(s1);

    //拷贝构造
    set<int> s2(s1);
    PrintSet(s2);

    set<int> s3;
    s3 = s2;
    PrintSet(s3);
}

3. set大小和交换

函数原型:
size();                    //返回容器中元素的数目
empty();              //判断容器是否为空
swap(st);               //交换两个集合容器

4. set插入和删除


函数原型:
insert(elem);          //在容器中插入元素。
clear();                   //清除所有元素
erase(pos);              //删除pos迭代器所指的元素,返回下一个元素的迭代器。


erase(beg,end);       //删除区间[beg,end)的所有元素,返回下一个元素的迭代器。
erase(elem);            //删除容器中值为elem的元素。

 5. set查找和统计

函数原型:
find(key);      //查找key是否存在,若存在,返回该键的元素的迭代器; 若不存在,返回set.end();
count( key);   //统计key的元素个数  0 1

 6.set和multiset区别

区别:
set不可以插入重复数据,而multiset可以
set插入数据的同时会返回插入结果,表示插入是否成功.

 multiset不会检测数据,因此可以插入重复数据

7.pair对组创建

功能描述:
成对出现的数据,利用对组可以返回两个薮据
两种创建方式:
pair<type, type> p ( value1, value2 );
pair<type, type> p -=make_pair( value1, value2 );

//第一种
    pair<string, int>p("tom", 36);
    cout << "姓名:" << p.first << "年龄:" << p.second;
    //第二种
    pair<string, int> p2 = make_pair("jerry", 95);
    cout << "姓名:" << p2.first << "年龄:" << p2.second;

8. set容器排序

set容器默认排承规则为从小到大
利用仿函数。可以改变排序规则

内置排序指定规则

class myCompare 
{
public:
    //重载()
    bool operator()(int v1, int v2) const
    {
        return v1 > v2;
    }
};
void test49789()
{
    //指定排序规则

    set<int, myCompare> s2;
    s2.insert(1235);
    s2.insert(255);
    s2.insert(343);
    s2.insert(678);
    //遍历
    for (set<int, myCompare>::iterator it = s2.begin(); it != s2.end(); it++) 
    {
        cout << "  " << *it;
    }
    cout << endl;
}

自定义数据类型排序

class Person
{
public:
    string m_Name;
    int m_Age;
    int m_Height;

    Person(string name, int age, int height)
    {
        this->m_Age = age;
        this->m_Height = height;
        this->m_Name = name;
    }

};
class ComparePersonHH
{
public:
    //重载()
    bool operator()(const Person &p1,const Person &p2)  const
    {
        //按照年龄降序
        return p1.m_Age > p2.m_Age;
    }
};
void test0145() 
{
    //自定义数据类型都会指定排序规则
    set<Person, ComparePersonHH> s;

    //准备数据
    Person p1("hey", 25, 175);
    Person p2("kiring", 35, 195);
    Person p3("iron man", 45, 180);
    Person p4("spide man", 25, 168);

    s.insert(p1);
    s.insert(p2);
    s.insert(p3);
    s.insert(p4);
    for (set<Person, ComparePersonHH>::iterator it = s.begin(); it != s.end(); it++) 
    {

        cout << " 姓名:" << (*it).m_Name << " 身高:" << (*it).m_Height << " 年龄:" << (*it).m_Age << endl;

    }

}

二、map

1.基本概念

简介:
 map中所有元素都是pair
 pair中第一个元素为key(键值),起到索引作用,第二个元素为value (实值)

所有元素都会根据元素的键值自动排序
本质:
 map/multimap属于关联式容器。底层结构是用二叉树实现。

优点:

可以根据key值快速找到value值

map和multimap区别:
map不允许容器中有重复key值元素

multimap允许容器中有重复key值元素

2.构造函数

函数原型:

构造;
map<T1,T2> mp;               //map默认构造函数:
map( const map &mp);      //拷贝构造函数
赋值:
map& operator=(onst map &mp);   //重载等号操作符

void printMap(map<int, int>& m) 
{
    for (map<int, int>::iterator it = m.begin(); it != m.end(); it++) {
        cout << " key:" << (*it).first << " value = " << it->second << endl;
    }
    cout << endl;
}
void test430()
{
    //创建map容器
    map<int, int> m;
    m.insert(pair<int, int>(1, 23));
    m.insert(pair<int, int>(3, 26));
    m.insert(pair<int, int>(4, 87));
    m.insert(pair<int, int>(5, 69));

    printMap(m);

    //拷贝构造
    map<int, int> m2(m);
    printMap(m2);

    //赋值
    map<int, int>m3;
    m3 = m2;
    printMap(m3);

3. map大小和交换

函数原型:
size();          //返回容器中元素的数目
empty();      //判断容器是否为空
swap(st);     //交换两个集合容器

4. map插入和删除

函数原型:
insert(elem);   //在容器中插入元素。

[ ]不建议插入,用途可以利用key访问到value


clear();            //清除所有元素
erase(pos);      //删除pos迭代器所指的元素,返回下一个元素的迭代器。


erase(beg,end); //删除区间[beg,end]的所有元素,返回下一个元素的迭代器。

  erase( key);     //删除容器中值为key的元素。

5. map查找和统计

函数原型:
find(key);       //查找key是否存在.若存在,返回该键的元素的迭代器;若不存在,返回map.end();

 count(key);    //统计key的元素个数

6.排序

map容器默认排序规则为按照key值进行从小到大排序
利用仿函数,可以改变排序规则

class CompareM {
public :
    bool operator()(int v1,int v2) const
    {
        return v1 > v2;
    }
};
void sortMap() 
{
    map<int, int, CompareM>m;

    m.insert(make_pair(2, 100));
    m.insert(make_pair(4, 10));
    m.insert(make_pair(6, 1000));
    m.insert(make_pair(7, 10000));

    for (map<int, int , CompareM>::const_iterator it = m.begin(); it != m.end(); it++) {
        cout << " key:" << (*it).first << " value = " << it->second << endl;
    }
}

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

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

相关文章

安装WMware16、centos7记录

将一台闲置电脑安装虚拟机&#xff0c;计划给个8G内存&#xff0c;80G硬盘&#xff0c;打算安装WMware16&#xff0c;对系统要求是win10 一、将win7升级到win10 1.1、正版的win10安装U盘制作教程 https://www.bilibili.com/video/BV1AW411G7Lq/?vd_sourcecaf04463d06774efd…

Okio 网络提速

文章目录网络数据处理流程Page Cache传统 I/O 拷贝的性能问题零拷贝技术DMA 技术零拷贝技术分类mmapsendfilespliceDirect I/O零拷贝技术性能分析小结OkioOkio 的使用Okio 网络提速的原理Okio 总结总结网络数据处理流程 在讲 Okio 之前&#xff0c;为了能更好的了解 Okio 的优…

如何制定项目里程碑 它的作用体现在哪

制定项目里程碑是项目管理中的一个重要步骤&#xff0c;它可以帮助团队确立项目目标、分解任务、评估风险、规划资源和监控进度。在这篇文章中&#xff0c;我们将介绍如何制定项目里程碑和它的作用。 如何制定项目里程碑 制定项目里程碑需要遵循以下步骤&#xff1a; 1、确定…

《程序员面试金典(第6版)》面试题 10.01. 合并排序的数组

题目描述 给定两个排序后的数组 A 和 B&#xff0c;其中 A 的末端有足够的缓冲空间容纳 B。 编写一个方法&#xff0c;将 B 合并入 A 并排序。 初始化 A 和 B 的元素数量分别为 m 和 n。 示例: 输入: A [1,2,3,0,0,0], m 3 B [2,5,6], n 3 输出: [1,2,2,3,5,6] 说明: …

简单六步,帮助HR高效管理零工

AIHR发布的《2023人力资源趋势》中提到&#xff0c;过去HR往往只关注全职员工&#xff0c;忽略了其他劳动力生态系统成员&#xff0c;比如零工、外包员工和临时工等&#xff0c;而如今这些劳动力生态系统的成员在公司的服务交付中发挥着越来越重要的作用。△ 传统劳动力生态系统…

Java入坑之集合、流与序列化

一、集合 1.1集合定义 集合概念&#xff1a; 保存和盛装数据的容器&#xff0c;将许多元素组合成一个单一单元的容器对象。集合&#xff0c;可用于存储/检索/操作/传输/聚合数据集合框架&#xff1a; 表示和操作集合的体系&#xff0c;包括接口、实现类&#xff0c;集合框架的…

【Nav2】Ubuntu18+ROS2 Eloquent跑通Navigation2仿真示例

【背景】 打算通过Navigation2来了解ROS2的核心两大件——LifeCircle和BehaviorTree&#xff0c;结果根据官网的教程一顿鼓捣&#xff0c;这个Turtlbot3的仿真就是跑不起来&#xff0c;这怎么能忍&#xff1f;虽然在Ubuntu20上使用Foxy版本可以非常容易就跑通demo&#xff0c;…

3年外包终上岸,我只能说:但凡有点机会,千万别去外包...

我大学学的是计算机专业&#xff0c;毕业的时候&#xff0c;对于找工作比较迷茫&#xff0c;也不知道当时怎么想的&#xff0c;一头就扎进了一家外包公司的软件测试岗&#xff0c;一干就是3年。现在终于跳槽到了互联网公司了&#xff0c;我想说的是&#xff0c;但凡有点机会&am…

behaviac —— Win10下Vs2017编译“腾讯行为树“源码

简介 - 腾讯行为树 behaviac是游戏AI的开发框架组件,也是游戏原型的快速设计工具。支持全平台,适用于客户端和服务器,助力游戏快速迭代开发 。编辑器可以运行在PC上,操作方便直观可靠,支持实时和离线调试;编辑器可以导出xml,bson等多种格式,更可以导出C++、C#源码,提供…

免费1年服务器,部署个ChatGPT专属网页版

作者&#xff1a;小傅哥 博客&#xff1a;https://bugstack.cn 沉淀、分享、成长&#xff0c;让自己和他人都能有所收获&#xff01;&#x1f604; 白皮袄个免费1年服务器&#xff0c;部署个ChatGPT专属网页版&#xff01; api.openai.com port 443: Connection timed out 你是…

Spring Security --- 基于内存模型创建用户角色

授权实现方式 基于内存模型实现授权基于默认数据库模型实现授权基于自定义数据库模型实现授权 基于内存模型创建用户角色 在Spring Security4.x版本中&#xff0c;登陆的用户有一个默认的ROLE_USER角色但是在Spring Security5.x版本中&#xff0c;把这个默认的角色给去掉了需要…

推荐一个3D建模工具集

3D建模工具集, 收录一下几个工具集&#xff1a;数字孪生编辑器 基于WebGL技术&#xff0c;依托丰富的模型资产库&#xff0c;通过拖拽式的操作&#xff0c;方便用户高效便捷的搭建三维数字孪生场景&#xff0c;配合twin服务平台&#xff0c;实现孪生设备姿态控制的虚实…

2023年第十四届蓝桥杯 C++ B组参赛经历和总结

2023年第十四届蓝桥杯 C B组参赛经历和总结 目录2023年第十四届蓝桥杯 C B组参赛经历和总结前言走上算法之路备考备战之路蓝桥杯比赛过程感受总结值不值得打备赛建议前言 写这篇博客的缘故&#xff0c;因为看到好几篇记录自己蓝桥杯经历的博客&#xff0c;于是乎我也想写一篇&…

【论文精读】Arxiv 2023 - Segment Anything

【论文精读】Arxiv 2023 - 分割一切 【论文原文】&#xff1a;Segment Anything 【作者信息】&#xff1a;Kirillov, Alexander and Mintun, Eric and Ravi, Nikhila and Mao, Hanzi and Rolland, Chloe and Gustafson, Laura and Xiao, Tete and Whitehead, Spencer and Ber…

如何设计帮助中心才能真正地帮助客户解决问题?

对于当今如此智能的时代&#xff0c;大多数人都习惯性地自己解决问题&#xff0c;所以在浏览某个网站或是使用某个产品遇到问题时&#xff0c;第一反应不再是找客服&#xff0c;而是到帮助中心去寻找解决问题的办法&#xff0c;因此&#xff0c;帮助中心变得越来越重要了。 那…

c# wpf log 调试 输出窗口

需求 刚好需要新手入门开发一个WPF界面&#xff0c;所以需要一些日志输出 其实我们只是简单的入门调试&#xff0c;只需要很简单的输出 真不需要log4net, expression等等比较长期地&#xff0c;跨度比较大的日志系统 而且这些日志系统接入也比较麻烦 有没办法做一个简单的…

多线程的使用与解释

多线程 文章目录多线程什么是多线程线程特点线程的使用线程的创建线程ID获得线程终止线程等待进程分离什么是多线程 是资源调用的最小单位。一个进程内部的控制序列。线程是调度的基本单位。 线程有共享进程的数据&#xff0c;也有自己 的一部分数据 线程特点 1&#xff0c…

电脑回收站删除的文件还能找回吗 电脑回收站删除的文件怎么恢复

电脑回收站是保护电脑文件和数据的重要屏障&#xff0c;被删除的文件数据在这里会被保存很久&#xff0c;直到被用户永久删除。为了保证电脑系统的流畅运行&#xff0c;我们会对电脑回收站进行清理。在一系列的操作过后&#xff0c;我们可能会发现自己误删了重要文件。那么电脑…

Leetcode135. 分发糖果

Every day a leetcode 题目来源&#xff1a;135. 分发糖果 解法1&#xff1a;贪心 首先把所有孩子的糖果数初始化为1。 从左往右遍历一遍&#xff0c;如果右边孩子的评分比左边的高&#xff0c;则右边孩子的糖果数更新为左边孩子的糖果数加1。 再从右往左遍历一遍&#xf…

匈牙利算法学习记录

匈牙利算法主要用来解决两个问题&#xff1a;求二分图的最大匹配数和最小点覆盖数。 匈牙利算法事实上有两个算法&#xff0c;分别解决指派问题和二分图最大匹配求解问题&#xff0c;此处算法指求解指派问题的匈牙利算法。 处理流程 方法一 具体如何实现呢&#xff1f; 代码…