map函数——STL库

 

map:映射,STL容器。

1,作用:

为了解决映射问题。

eg.

arry[0] = 25 就是将0映射到25

db[0] = 3.24 就是将0映射到3.14

但是数组无论怎么定义都是将int映射到其他类型。

 

map可以将任何类型的(包括STL容器)映射到任何基本类型(包括STL容器)。

 

2,定义

map<typename1, typename2> mp;

map需要定义前映射类型(键key)和映射后类型(值value),所以需要在<>内填写两个类型。

⚠️:如果是字符串到整数的映射,必须使用string而不能使用char数组;(因为char数组作为数组,是不能被作为键值的)

map<string, int> mp;

map的键和值也可以是STL容器,例如可以将一个set容器映射到一个字符串

eg.

map<set<int>, string> mp;

3,map容器内元素的访问

1)通过下表访问

eg.

对于一个定义为map<char,int> mp的map,

可以通过mp[‘c’]的方式来访问它对应的整数,

当建立映射时,就可以直接使用mp[‘c’]=20这样和普通数组一样的方式。

⚠️:map中的键是唯一的,起那面赋的值,将会被后面的赋值所替代。

#include<cstdio>
#include<map>
using namespace std;
int main(int argc, char const *argv[])
{
  map<char, int> mp;
  mp['c'] = 20;
  mp['c'] = 50;
  printf("%d\n", mp['c']);
  return 0;
}

2)通过迭代器访问

补充知识:

容器是数据结构的泛指,迭代器是指针的泛指。

C++迭代器是一种检查容器内元素并遍历元素的数据类型。

迭代器的作用就相当于去除物品的工具的抽象。

c++迭代器interator就是一个指向某STL对象的指针。通过该指针可以简单方便地遍历所有元素。

map迭代器的定义与其他STL容器迭代器定义的方式相同:

map<typename1, typename2>::iterator it;

typename1和typename2就是定义map时填写的类型,这样就得到了迭代器it。

map迭代器的使用方式和其他的STL容器的迭代器不同,因为map每一对迭代器映射都有两个typename,这决定了必须通过一个int来同时访问键和值。

map可以使用it->first来访问键,使用it->second来访问值。

//由于map内部是由红黑树实现的(set也是),在建立映射的过程中会自动实现从小到大的排序功能
#include<cstdio>
#include<map>
using namespace std;
int main(int argc, char const *argv[])
{
  map<char, int> mp;
  mp['g'] = 22;
  mp['a'] = 38;
  mp['z'] = 58;
  for (map<char, int>::iterator it = mp.begin(); it != mp.end() ; ++it)
  {
    printf("%c %d\n", it->first, it->second);
  }
  return 0;
}

3,map常用函数实例解析

1)find()

find(key)返回键为key的映射的迭代器,时间复杂度为O(logN),N为map中映射的个数。

#include<cstdio>
#include<map>
using namespace std;
int main(int argc, char const *argv[])
{
  map<char, int> mp;
  mp['a'] = 1;
  mp['b'] = 2;
  mp['c'] = 3;
  map<char, int>::iterator it = mp.find('b');
  printf("%c %d\n", it->first, it->second);
  return 0;
}

2)erase()

有两种用法:删除单个元素,删除一个区间内的所有元素

a,删除单个元素

mp.erase(it), it为需要删除的元素的迭代器,时间复杂度为O(1)

mp.erase(key),key为要删除的映射的键,时间复杂度为O(logN), N为map内元素的个数

#include<cstdio>
#include<map>
using namespace std;
int main(int argc, char const *argv[])
{
  map<char, int> mp;
  mp['a'] = 1;
  mp['c'] = 3;
  mp['b'] = 2;
  map<char, int>::iterator it = mp.find('a');
  mp.erase(it);
  for (map<char, int>::iterator it = mp.begin(); it != mp.end() ; ++it)
  {
    printf("%c %d\n", it->first, it->second);
  }
  return 0;
}
#include<cstdio>
#include<map>
using namespace std;
int main(int argc, char const *argv[])
{
  map<char, int> mp;
  mp['b'] = 2;
  mp['a'] = 1;
  mp['c'] = 3;
  mp.erase('b');
for (map<char, int>::iterator it = mp.begin(); it != mp.end() ; ++it)
{
  printf("%c %d\n", it->first, it->second);
}
  return 0;
}

 

b,删除一个区间的所有元素

mp.erase(first,last),其中first为需要删除的区间起始迭代器,而last则是需要删除的区间末尾迭代器的下一个地址,也即为删除左闭区间[first,last),时间复杂度为O(last-first)

#include<cstdio>
#include<map>
using namespace std;
int main(int argc, char const *argv[])
{
  map<char, int> mp;
  mp['b'] = 2;
  mp['c'] = 3;
  mp['a'] = 1;
  map<char, int>::iterator it = mp.find('b');
  mp.erase(it, mp.end());
  for (map<char, int>::iterator it = mp.begin(); it != mp.end() ; ++it)
  {
    printf("%c %d\n", it->first, it->second);
  }
  return 0;
}

3)szie()

作用:用来获得map中的映射个数,时间复杂度为O(1)

#include<cstdio>
#include<map>
using namespace std;
int main(int argc, char const *argv[])
{
  map<char, int> mp;
  mp['a'] = 1;
  mp['b'] = 2;
  mp['c'] = 3;
  mp.clear();
  printf("%d\n", mp.size());
  return 0;
}

4)clear()

作用:用来清空map中的所有的元素,复杂度为O(N),其中N为map中的元素个数

4.map的常见用途

1)需要建立字符(或字符串)与 整数之间映射的题目,使用map可以减少代码量;

2)判断大整数或者其他类型数据是够存在的题目,可以把map当bool数组用;

2)字符串与字符串的映射也可能会遇到

⚠️:map的键和值是唯一的,而如果一个键需要对应多个值,就只能用multimap。另外,c++11标准中还增加了undered_map,以散列替代内部的红黑树实现,使其可以用来映射而不按key排序的需求。

  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

繁星蓝雨

如果觉得文章不错可以请喝咖啡

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值