c++ map用法 入门必看 超详细

2023-11-15

1、map的作用
可以实现各种类型的映射。可以用数组来类比,都是由下标和值组成,但数组用法很局限,下标不能是负数,而且开数组需要消耗太多的内存,开到10^7就内存超限了。因此,很多时候都用高级的map类或vector类来代替数组。其里面的成员函数为我们写程序提供了很多便利。

2、map的定义
map<下标类型,值类型> 变量名;
如:
int对int型 map<int,int> a;
int对double型 map<int,double> a;
double对int型 map<double,int> a;
还可以是结构体(类)对结构体(类)等,用法如下:

代码:

#include<iostream>//c++标准头文件,可以使用cout,cin等标准编译用法
#include<map>//使用map需要带上这个文件
#include<string>//字符串一般都用这个代替c语言中char数组
#include<vector>
using namespace std;//命名空间,防止重名给程序带来各种隐患,使用cin,cout,map,vector,queue时都要使用
struct a//定义结构体a
{
    int x;
    bool operator <(const a c)const
    {
        return x<c.x;
    }
};
struct b//定义结构体b
{
    int y;
};
int main()//主函数
{
    map<int,int> var1;//举例子,int对int,定义
    var1[-5]=3;//-5映射3
    var1[6]=2;//6映射2
    cout<<"int对int用法:"<<endl;
    cout<<"var1[-5]="<<var1[-5]<<endl;
    cout<<"var1[6]="<<var1[6]<<endl;
    cout<<"var1[3]="<<var1[3]<<endl<<endl;//没有赋值,初始都为0
    //
    //int对结构体a
    map<int,a> var2;
    struct a value1,value2;//用结构体定义一个变量value1和一个变量value2
    value1.x=111;
    value2.x=222;//给成员赋值
    var2[3]=value1;
    var2[5]=value2;
    cout<<"int对结构体a的用法"<<endl;
    cout<<"var2[3].x="<<var2[3].x<<endl;
    cout<<"var2[5].x="<<var2[5].x<<endl;
    cout<<"var2[6].x="<<var2[6].x<<endl;//没赋值就是一个原始结构体
    var2[6].x=333;//可以直接修改
    cout<<"修改后"<<endl<<"var2[6].x="<<var2[6].x<<endl<<endl;
    //
    //结构体a对结构体b
    map<a,b> var3;
    a value3;
    b value4;
    value3.x=444;
    value4.y=555;
    var3[value3]=value4;//map的下标是有序的,使用结构体当下标时需要重载运算符
    cout<<"结构体a对结构体b:"<<endl;
    cout<<"var3[value3].y="<<var3[value3].y<<endl;
    value4.y=666;
    cout<<"修改value4.y的值为666后"<<endl<<"var3[value3].y="<<var3[value3].y<<endl;//map映射不是地址映射而是值映射
    value3.x=777;
    cout<<"修改value3.x的值为777后"<<endl<<"var3[value3].y="<<var3[value3].y<<endl<<endl;//map映射不是地址映射而是值映射
    //
    //string对int
    map<string,int> var4;
    string s1("abc"),s2("cba");
    var4[s1]=1;
    var4[s2]=2;
    cout<<"string对int"<<endl;
    cout<<"var4[s1]="<<var4[s1]<<endl;//实际可以理解为"abc"=1;
    cout<<"var4[s2]="<<var4[s2]<<endl;//实际可以理解为"cba"=2
    //
    //map,vector,queue,set联合使用还可以实现一对多,多对一,映射队列等多种用法,讲解还需要其它很多知识,下次再一一详解啦
}

运行结果:

intint用法:
var1[-5]=3
var1[6]=2
var1[3]=0

int对结构体a的用法
var2[3].x=111
var2[5].x=222
var2[6].x=0
修改后
var2[6].x=333

结构体a对结构体b:
var3[value3].y=555
修改value4.y的值为666后
var3[value3].y=555
修改value3.x的值为777后
var3[value3].y=0

string对int
var4[s1]=1
var4[s2]=2

3、map的常用的成员函数

begin() //返回指向map头部的迭代器,遍历的时候经常需要用到
end() //返回指向map尾部后一位的迭代器
rebegin() //返回指向map头部的迭代器
rend() //返回指向map尾部后一位的迭代器
size() //返回map中元素的个数
erase() //删除一个元素
find() //查找一个元素
empty() //查看是否为空

map的成员函数常用的就几个,比较好上手

4、map遍历
需要使用迭代器,用法如下:

代码:

#include<iostream>
#include<map>
using namespace std;
int main()
{
    map<int,int> a;
    a[1]=2;
    a[3]=4;
    a[5]=6;
    a[9]=10;//a[7]和a[9]是乱序的遍历时map会自动排序
    a[7]=8;
    map<int,int>::iterator it;//使用迭代器
    for(it=a.begin();it!=a.end();it++)
    {
        cout<<"a["<<it->first<<"]="<<it->second<<endl;
    }
    //it->first是下标,it->second是值
}

运行结果:

a[1]=2
a[3]=4
a[5]=6
a[7]=8
a[9]=10

刚接触肯定会觉得难,多些做题多些用,熟悉了就容易了,兄弟萌,加油!!!

文章尚有不足,欢迎大牛们指正

感谢观看,点个赞吧

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

c++ map用法 入门必看 超详细 的相关文章

  • 查找哪些页面不再与写入时复制共享

    假设我在 Linux 中有一个进程 我从中fork 另一个相同的过程 后forking 因为原始进程将开始写入内存 Linux写时复制机制将为进程提供与分叉进程使用的不同的唯一物理内存页 在执行的某个时刻 我如何知道原始进程的哪些页面已被写
  • 为什么libc++的shared_ptr实现使用完整内存屏障而不是宽松内存屏障?

    在boost的实现中shared ptr 它用放松内存排序以增加其引用计数 https github com boostorg smart ptr blob master include boost smart ptr detail sp
  • ASP.NET MVC 中的经典 ASP (C#)

    我有一个应用程序想要 最终 转换为 ASP NET MVC 我想要进行全面的服务升级 到 ASP NET 但想要使用当前的 ASP 内容来运行当前的功能 这样我就可以在对新框架进行增量升级的同时升级小部分 该站点严重依赖于不太成熟的 VB6
  • OpenCv读/写视频色差

    我试图简单地使用 openCV 打开视频 处理帧并将处理后的帧写入新的视频文件 我的问题是 即使我根本不处理帧 只是打开视频 使用 VideoCapture 读取帧并使用 VideoWriter 将它们写入新文件 输出文件看起来比输入更 绿
  • 为什么要序列化对象需要 Serialized 属性

    根据我的理解 SerializedAttribute 不提供编译时检查 因为它都是在运行时完成的 如果是这样 那么为什么需要将类标记为可序列化呢 难道序列化器不能尝试序列化一个对象然后失败吗 这不就是它现在所做的吗 当某些东西被标记时 它会
  • ASP MVC:服务应该返回 IQueryable 的吗?

    你怎么认为 你的 DAO 应该返回一个 IQueryable 以便在你的控制器中使用它吗 不 您的控制器根本不应该处理任何复杂的逻辑 保持苗条身材 模型 而不是 DAO 应该将控制器返回给视图所需的所有内容 我认为在控制器类中看到查询 甚至
  • 在 2D 中将一个点旋转另一个点

    我想知道当一个点相对于另一个点旋转一定角度时如何计算出新的坐标 我有一个块箭头 想要将其相对于箭头底部中间的点旋转角度 theta 这是允许我在两个屏幕控件之间绘制多边形所必需的 我无法使用和旋转图像 从我到目前为止所考虑的情况来看 使问题
  • 在非活动联合成员上使用“std::addressof”是否定义明确[重复]

    这个问题在这里已经有答案了 下面的代码是尝试实现constexpr的版本offsetof在 C 11 中 它可以在 gcc 7 2 0 和 clang 5 0 0 中编译 这取决于申请std addressof工会非活跃成员的成员 这是明确
  • C# 中条件编译符号的编译时检查(参见示例)?

    在 C C 中你可以这样做 define IN USE 1 define NOT IN USE 1 define USING system 1 system 1 IN USE 进而 define MY SYSTEM IN USE if US
  • 如何在c#中的内部类中访问外部类的变量[重复]

    这个问题在这里已经有答案了 我有两个类 我需要声明两个类共有的变量 如果是嵌套类 我需要访问内部类中的外部类变量 请给我一个更好的方法来在 C 中做到这一点 示例代码 Class A int a Class B Need to access
  • 为什么我不应该对不是由 malloc() 分配的变量调用 free() ?

    我在某处读到 使用它是灾难性的free删除不是通过调用创建的对象malloc 这是真的 为什么 这是未定义的行为 永远不要尝试它 让我们看看当您尝试时会发生什么free 自动变量 堆管理器必须推断出如何获取内存块的所有权 为此 它要么必须使
  • 通过 NHibernate 进行查询,无需 N+1 - 包含示例

    我有一个 N 1 问题 我不知道如何解决它 可以在这个问题的底部找到完全可重复的样本 因此 如果您愿意 请创建数据库 设置 NUnit 测试和所有附带的类 并尝试在本地消除 N 1 这是我遇到的真实问题的匿名版本 众所周知 这段代码对于帮助
  • 是否可以有一个 out ParameterExpression?

    我想定义一个 Lambda 表达式out范围 有可能做到吗 下面是我尝试过的 C Net 4 0 控制台应用程序的代码片段 正如您在 procedure25 中看到的 我可以使用 lambda 表达式来定义具有输出参数的委托 但是 当我想使
  • 当前的 x86 架构是否支持非临时加载(来自“正常”内存)?

    我知道有关此主题的多个问题 但是 我没有看到任何明确的答案或任何基准测量 因此 我创建了一个处理两个整数数组的简单程序 第一个数组a非常大 64 MB 第二个数组b很小 无法放入 L1 缓存 程序迭代a并将其元素添加到相应的元素中b在模块化
  • 什么是 __declspec 以及何时需要使用它?

    我见过这样的例子 declspec在我正在阅读的代码中 它是什么 我什么时候需要使用这个构造 这是 Microsoft 对 C 语言的特定扩展 它允许您使用存储类信息来赋予类型或函数属性 文档 declspec C https learn
  • 运算符“==”不能应用于“int”和“string”类型的操作数

    我正在编写一个程序 我想到了一个数字 然后计算机猜测了它 我一边尝试一边测试它 但我不断收到不应该出现的错误 错误是主题标题 我使用 Int Parse 来转换我的字符串 但我不知道为什么会收到错误 我知道它说 不能与整数一起使用 但我在网
  • 使用 C# 从 DateTime 获取日期

    愚蠢的问题 给定日期时间中的日期 我知道它是星期二 例如我如何知道它的 tue 2 和 mon 1 等 Thanks 您正在寻找星期几 http msdn microsoft com en us library system datetim
  • 双精度类型二维多维数组的 pinvoke 编组作为 c# 和 c++ 之间的输入和输出

    我有以下我正在尝试解决的双物质类型的 2d 多维数组的 c 和 c pinvoke 编组 我已经查看了以下热门内容以获得我目前拥有的内容使用双精度数组进行 P Invoke 在 C 和 C 之间编组数据 https stackoverflo
  • 使用 Crypto++ 获取 ECDSA 签名

    我必须使用 Crypto 在变量中获取 ECDSA 签名 我在启动 SignMessage 后尝试获取它 但签名为空 我怎样才能得到它 你看过 Crypto wiki 吗 上面有很多东西椭圆曲线数字签名算法 http www cryptop
  • 是否可以在 C# 中强制接口实现为虚拟?

    我今天遇到了一个问题 试图重写尚未声明为虚拟的接口方法的实现 在这种情况下 我无法更改接口或基本实现 而必须尝试其他方法 但我想知道是否有一种方法可以强制类使用虚拟方法实现接口 Example interface IBuilder

随机推荐