首页 > 编程语言 >c++ stl 之映射—— map 详解

c++ stl 之映射—— map 详解

时间:2024-03-24 10:04:27浏览次数:34  
标签:map cout stl 复杂度 c++ 如下 vector mp

 map是 stl 的一个关联容器,名叫“映射”,何为“映射”?其实就是一个数组,但有了数组何必还需映射,这是一个高深的问题。

目录

一、map 简介

         1.空间复杂度

        2.时间复杂度 

        3.“键”的类型

二、 map 用法

         1.声明

        2.新增“键”

三、map 遍历

        1.使用 “iterator”

         2.使用 “auto”

四、关于 map 的函数

        1.find

         2.clear

         3.erase

        4.empty

        5.swap

        6.count


一、map 简介

        1.空间复杂度

    map 类似于 vector,可以随时创建新的“键”(类似下标),避免浪费过多空间,具体实现如下:

pair<iterator, bool> insert(_Pp&& __p)
{
    return __tree_.__insert_unique(_VSTD::forward<_Pp>(__p));
}

        2.时间复杂度 

    map 使用了红黑树(一种自平衡二叉查找树),每次插入新的键和搜索时都只用 O(log size) 的时间复杂度,虽然数组只需 O(1) 的时间复杂度,但在空间方面数组极差。它与 vector 空间复杂度相同,但远优于 vector O(size) 的时间复杂度。具体实现在头文件 bits/stl_tree 中。 

        3.“键”的类型

    map 键可以为任何类型,但必须具有小于比较模版或比较函数,在这一点上一个数组完全达不到。具体实现运用了类模板,如下:

template <class _Key, class _Tp, class _Compare = less<_Key>,
          class _Allocator = allocator<pair<const _Key, _Tp> > >

二、 map 用法

         1.声明

首先需要引用 “map” 头文件,如下: 

#include <map>

    声明时和一般模版类的声明方式一样,先注明类型(即 map )再填写模版,注意 map 的“键”和“值”的类型均需声明,最后为变量名。例如:

map <int,int> mp;

        2.新增“键”

    由于 map 中兼容了中括号(“[”、“]”)所以可以像访问数组一样访问或创建,如下:

mp[2]=1;

    若只创建“键”而不赋值系统会默认为 0 ,例如: 

mp[1];
cout << mp[1];

    输出: 

0

    也可以使用 “insert”  函数,如下:

mp.insert(1,1);

三、map 遍历

        1.使用 “iterator”

    “iterator” 中文名为“迭代器”,访问方式如下:

for(map <int,int>::iterator it = mp.begin();it != mp.end();++ it)
{
    cout << *it -> first << ' ' << *it -> second;
}

    map 中有两个变量,"first" 和 "second",即“键”和“值”,
由于 "it" 是一个指针,所以需要 "->" 来访问。  

         2.使用 “auto”

    c++11 以后,新增了一种 for 循环语法(如下), vector、list 等容器也可以这么访问。

for (auto i : v)
{
		
}

四、关于 map 的函数

        1.find

    查找 x 再 map 中的位置,若不存在这个键返回 “mp.end()”,各自返回指针,如下:

cout << mp.find(x) -> first;

         2.clear

    清空 map,vector 等容器也有这个函数,如下:

mp.clear();

         3.erase

    清除一个键对,或从 “begin” 到 “end” 的所有键对,注意参数需为指针,如下: 

mp.eraser(mp.find(x));
mp.eraser(begin,end);

        4.empty

    查看 map 是否为空,如下:

if(mp.empty()) cout << "Yes";

        5.swap

     交换两个 map,如下:

mp.swap(temp);

        6.count 

    查找 x 在 map 中出现了几次,如下:

cout << mp.count(x);

你学会了吗? 

标签:map,cout,stl,复杂度,c++,如下,vector,mp
From: https://blog.csdn.net/zhhg0123/article/details/136963562

相关文章

  • C++面向对象编程 - 组合:C++中的组合是一种类与类之间的关系
    C++面向对象编程-组合在C++中,面向对象编程(Object-OrientedProgramming,简称OOP)是一种强大的编程范式,它允许我们通过类(Class)和对象(Object)的概念来组织和管理代码。在面向对象编程中,类不仅可以包含数据成员(Attributes)和成员函数(Methods),还可以与其他类建立各种关系。其中一......
  • c++学习路线
    学习C++可以按照以下路线进行:基础知识:了解C++语言的基本语法和特性学习C++的数据类型、控制流和函数熟悉面向对象编程的概念和用法类和对象:学习如何定义类和对象理解类的构造函数、析构函数和成员函数掌握类的继承、多态和封装特性STL库:熟悉STL(标准模板库)的常用容器,......
  • 构建空间场景轻应用,Mapmost Alpha来啦【文末赠书(10本)--第二期】
    文章目录:一、MapmostAlpha介绍二、MapmostAlpha应对数字孪生业务痛点解决之道2.1MapmostAlpha提供海量城市底板2.2MapmostAlpha提供便捷的配置管理工具2.3MapmostAlpha提供一键式部署发布和分享三、沉浸式体验MapmostAlpha3.1创建应用3.2新手指导3.3场......
  • Golang: 探究sync.map的实现
    Golang:探究sync.map的实现背景探究下载并发模式下,sync.map的实现,以及该实现方式可能引入的问题链接Github基本使用packagemainimport"sync"funcmain(){ m:=sync.Map{} m.Load("key") m.Store("key","value") m.LoadOrStore("key",&q......
  • HashMap的数组最大容量为什么要设计为2的30次方?而不是2的31次方-1?数组容量为什么一定
    目录问题 数组容量为什么一定要设计为2的幂(2的n次方)?1、首先要清楚HashMap的底层基本原理2、再来看下怎么通过hash值决定存放在哪个桶中?首先看下hash值再看下怎么确定当前key存放在哪个数组下标下的为什么要做按位与而不用模运算符%?为什么要n-1呢?n是一个什么样的数......
  • C++U4- 04 - 新递推2
     排列 公式 单选 组合数 单选 递推练习[直线分割平面问题]   【参考代码】#include<iostream>usingnamespacestd;inta[1010];//a[i]:第i条直线最多能将这个圆分割成的部分数intmain(){//1、定义变量n,进行输入,数组a进行存储......
  • C++必知必会 C++11实用特性
    文章目录前言nullptr和NULLconst和constexprauto和decltypelambda表达式function和bind右值引用移动语义move智能指针前言C++11开始添加了很多好用的新特性,个人认为想要真正掌握这些特性还是需要多读代码,多应用这些特性,本文只记录了一些个人用过的,并结合自己的使用......
  • 【华为OD机试】真题A卷-连接器问题(C++)
    一、题目描述【华为OD机试】真题A卷-连接器问题(C++)题目描述:有一组区间[a0,b0],[a1,b1],…(a,b表示起点,终点),区间有可能重叠、相邻,重叠或相邻则可以合并为更大的区间;给定一组连接器[x1,x2,x3,…](x表示连接器的最大可连接长度,即x>=gap),可用于将分离的区间连接起来,但两个分离区间之间只......
  • 突破编程_C++_C++11新特性(lambda表达式的基础知识)
    1Lambda表达式简介1.1Lambda表达式的定义与概念Lambda表达式是C++11引入的一种函数对象的匿名表示方法,它的定义与概念基于数学中的λ演算。Lambda表达式为程序员提供了一种更加简洁、灵活的方式来定义轻量级的、临时的、内联的函数对象,通常用于函数式编程的场景......
  • 跳马【华为OD机试JAVA&Python&C++&JS题解】
    一.题目马是象棋(包括中国象棋和国际象棋)中的棋子,走法是每步直一格再斜一格,即先横着或直着走一格,然后再斜着走一个对角线,可进可退,可越过河界,俗称“马走‘日’字。给顶m行n列的棋盘(网格图),棋盘上只有有棋子象棋中的棋子“马”,并且每个棋子有等级之分,等级为k的马可以跳1~k......