首页 > 其他分享 >【STL】 pair/map的简介与用法

【STL】 pair/map的简介与用法

时间:2023-12-23 10:45:43浏览次数:44  
标签:返回 map mapStudent STL 元素 value pair

pair简介:

pair 是一个很实用的"小玩意",当想要将两个元素绑在一起作为一个合成元素、又不想要因此定义结构体时,使用 pair 可以很方便地作为一个代替品。

pair 实际上可以看作一个内部有两个元素的结构体,且这两个元素的类型是可以指定的,如下面的短代码所示

struct pair {
    typename first;
    typename second;
}name;
  1. pair的使用

要使用 pair,应先添加头文件 #include <utility> ,然后就可以使用了。

注意:由于 map 的内部实现中涉及 pair,因此添加 map 头文件时会自动添加 utility 头文件,此时如果需要使用 pair,就不需要额外再去添加 utility 头文件了。因此,记不住 utility 拼写的,可以偷懒地用 map 头文件来代替 utility 头文件。

pair 有两个参数,分别对应 first 和 second 的数据类型,它们可以是任意基本数据类型或容器。

pair<typename1,typename2> name

如果想在定义 pair 时进行初始化,只需要跟上一个小括号,里面填写两个想要初始化的元素即可:

pair<int, string>(000, "student_zero")

或者也可使用

make_pair(v1,v2)// 以v1和v2的值创建一个新的pair对象,其元素类型分别是v1和v2的类型

    2. pair 中元素的访问

可以使用结构体的方法访问:

name.first访问第一个,name.second访问第二个

   3、pair 常用函数实例解析

比较操作数

两个pair 类型数据可以直接使用 =、!=、<、<=、>、>= 比较大小,比较规则是先以 first 的大小作为标准,只有当 first 相等时才去判别 second 的大小。

 

Map简介:

map是STL的一个关联容器,它提供一对一的hash

  • 第一个可以称为关键字(key),每个关键字只能在map中出现一次;
  • 第二个可能称为该关键字的值(value);

自动建立Key -value的对应。key 和value可以是任意你需要的类型。

根据key值快速查找记录,查找的复杂度基本是Log(N),(查找的实现原理是二分吗?)如果有1000个记录,最多查找10次,1,000,000个记录,最多查找20次。

快速插入Key - Value 记录。

快速删除记录 根据Key 修改value记录。 

遍历所有记录。

 

map內部的实现自建一颗红黑树,这颗树具有对数据自动排序的功能。在map内部所有的数据都是有序的

 

     1.map的使用

  1. 必须导入包
#include<map>

      2.定义map对象

map<typename1,typename2> name //第一个是key,第二个是value

     3.map的访问

//可以通过下标访问
name[1] = "student01";
//也可以通过迭代器访问
map<char,int>maps;
   maps['d']=10;
   maps['e']=20;
   maps['a']=30;
   maps['b']=40;
   maps['c']=50;
   maps['r']=60;
   for(map<char,int>::iterator it=mp.begin();it!=mp.end();it++)
   {
       cout<<it->first<<" "<<it->second<<endl;
   }

    4.map的常见用法

1.insert() (插入元素)

map<int,string> mapString;
//通过insert()插入
mapString.insert(pair<int,string>(01,"student01"));
mapString.insert(map<int, string>::value_type(001, "student_one"));
//通过数组插入
mapString[01] = "student01';

即当map中有这个关键字时,insert操作是不能在插入数据的,但是用数组方式就不同了,它可以覆盖以前该关键字对应的值 。

那么我们如何知道insert是否插入成功呢?

// 构造定义,返回一个pair对象
pair<iterator,bool> insert (const value_type& val);
 
pair<map<int, string>::iterator, bool> Insert_Pair;
 
Insert_Pair = mapString.insert(map<int, string>::value_type (01, "student01"));
 
if(!Insert_Pair.second)
    cout << ""Error insert new element" << endl;

2.find()

// find 返回迭代器指向当前查找元素的位置否则返回map::end()位置(原理是二分吗?)
map<string,int>::iterator iter;
iter = mapStudent.find("123");
 
if(iter != mapStudent.end())
       cout<<"Find, the value is"<<iter->second<<endl;
else
   cout<<"Do not Find"<<endl;

 3.erase

//迭代器刪除
iter = mapStudent.find("123");
mapStudent.erase(iter);
 
//用关键字刪除
int n = mapStudent.erase("123"); //如果刪除了會返回1,否則返回0
 
//用迭代器范围刪除 : 把整个map清空
mapStudent.erase(mapStudent.begin(), mapStudent.end());
//等同于mapStudent.clear()

4.size

//如何知道map映射了几次
int nSize = mapStudent.size();

 

下面是各种杂七杂八的东西:

     begin()         返回指向map头部的迭代器

     clear()        删除所有元素

     count()         返回指定元素出现的次数, (帮助评论区理解: 因为key值不会重复,所以只能是1 or 0)

     empty()         如果map为空则返回true

     end()           返回指向map末尾的迭代器

     equal_range()   返回特殊条目的迭代器对

     erase()         删除一个元素

     find()          查找一个元素

     get_allocator() 返回map的配置器

     insert()        插入元素

     key_comp()      返回比较元素key的函数

     lower_bound()   返回键值>=给定元素的第一个位置

     max_size()      返回可以容纳的最大元素个数

     rbegin()        返回一个指向map尾部的逆向迭代器

     rend()          返回一个指向map头部的逆向迭代器

     size()          返回map中元素的个数

     swap()           交换两个map

     upper_bound()    返回键值>给定元素的第一个位置

     value_comp()     返回比较元素value的函数

 

map内部排序的实验:

#include<iostream>
#include<map>
using namespace std;

int main() {
map<int,int> Test;

Test[1000] = 3;
Test[4] = 1;
Test[23] = 2;


map<int,int>::iterator it;
for (it = Test.begin();it != Test.end();it++)
cout <<it->first<<" "<<it->second<<endl;

return 0;
}

output:

4 1
23 2
1000 3

map容器默认排序规则为 按照key值进行 从小到大排,也可以自定义,但是我没学()以后再说

 

【C++每日知识点】map<Key,Value>、multimap<Key,Value> 和 unordered_map<Key,Value> - 知乎 (zhihu.com)

标签:返回,map,mapStudent,STL,元素,value,pair
From: https://www.cnblogs.com/Yukie/p/17922731.html

相关文章

  • 【STL】 lower_bound和upper_bound
    在STL提供的 algorithm 头文件中,提供了两个函数:upper_bound 和 lower_bound,这俩函数功能”类似“,但并不相同。lower_bound(begin,end,val)在有序的数组连续地址的[begin,end)内找到第一个位置并返回其地址,使得val插入这个位置前面,数组仍然保持有序upper_bound(begin,end,......
  • MapStruct+Maven+Lombok问题NoSuchBeanDefinitionException、does not have an access
    概述先直接说我遇到的问题吧,SpringBoot应用启动失败:ERROR|org.springframework.boot.web.embedded.tomcat.TomcatStarter|onStartup|61|-ErrorstartingTomcatcontext.Exception:org.springframework.beans.factory.UnsatisfiedDependencyException.Message:Error......
  • 浅谈C++STL(Standard Template Library,标准模板库)
    2.1STL的诞生长久以来,软件界一直希望建立一种可重复利用的东西C++的面向对象和泛型编程思想,目的就是复用性的提升大多情况下,数据结构和算法都未能有一套标准,导致被迫从事大量重复工作为了建立数据结构和算法的一套标准,诞生了STL2.2STL基本概念STL(StandardTemplateLibrary,标......
  • 关于Android图像Bitmap类你要知道的一切
    Bitmap介绍Bitmap是一种图像文件格式,它由像素阵列组成,每个像素都有自己的颜色信息。在计算机图形学中,Bitmap图像可以被描述为一个二维的矩阵,其中每个元素代表一个像素的颜色值。Android中的Bitmap是用来表示图像的类,它可以用来加载、显示和处理图像。你可以通过Bitmap类来创建一个......
  • nginx map 指令
    map指令是一项强大的功能,由ngx_http_map_module模块提供,默认情况下,nginx有加载这个模块,除非人为地排除(--without-http_map_module)。什么是map指令?map指令允许我们在Nginx配置文件中创建一个变量映射,以便根据输入变量的值映射到相应的输出变量值。这个特性可以用于根据特定......
  • Hive-mapjoin详解(mapjoin原理)
    笼统的说,Hive中的Join可分为CommonJoin(Reduce阶段完成join)和MapJoin(Map阶段完成join)。本文简单介绍一下两种join的原理和机制。一.CommonJoin如果不指定MapJoin或者不符合MapJoin的条件,那么Hive解析器会将Join操作转换成CommonJoin,即在Reduce阶段完成join。CommonJoin整个......
  • Guava中的多值映射Multimap的深入分析
    第1章:引言今天小黑要重点介绍的是Guava中超实用的一个工具:Multimap。Multimap这个东西,其实可以看作是Map的一个加强版。在Java标准库中,一个key只能对应一个value,但在实际开发中,我们经常会遇到一个key对应多个value的情况,这时候就有点力不从心了。比如,假设咱们要管理一个学校的......
  • Spring MVC 源码分析 - HandlerMapping 组件(二)之 HandlerInterceptor 拦截器
    HandlerMapping组件HandlerMapping组件,请求的处理器匹配器,负责为请求找到合适的 HandlerExecutionChain 处理器执行链,包含处理器(handler)和拦截器们(interceptors)handler 处理器是Object类型,可以将其理解成HandlerMethod对象(例如我们使用最多的 @RequestMapping 注解所标......
  • SigmaPlot 15:高效精准,让科学绘图更简单
    SigmaPlot15是一款广受欢迎的科学绘图软件,它为科学家、数据分析师和研究者们提供了一款强大且易于使用的工具,以创建高质量的图表和图形。这款软件具备丰富的功能,能够满足各种科学绘图需求。点击获取SigmaPlot15SigmaPlot15具有直观的用户界面,使得用户可以轻松地学习和使用。......
  • Map+函数式接口去掉if-else
    判断条件放在key中对应的业务逻辑放在value中这样子写的好处是非常直观,能直接看到判断条件对应的业务逻辑代码:importcom.wing.service.QueryGrantTypeService;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.web.bind.......