【C++】map的常用用法

map的主要功能是映射,它可以将任何基本类型(包括STL容器)映射到任何基本类型(包括STL容器)

  • 在使用map的时候需要添加map的头文件,即 #include<map>

1. map的定义

 单独定义一个map :

map<typename1, typename2> mp;

 map需要映射前的(键key)和映射后的类型(值value),所以需要在<>内填写两个类型,其中第一个是键的类型,第二个是值的类型。如果是字符串到整型的映射,必须使用string而不能使用char数组(char作为数组是不能被作为键值的):

map<string, int> mp;

2. map容器内元素的访问:

 两种方式访问:

  • 1.通过下标访问:
     和普通的数组一样,但是同时map中的键是唯一的。在以下的代码中,mp[‘C’]的输出最终是2。
#include<iostream>
#include<map>

using namespace std;

int main()
{
    map<char, int> mp;
    mp['C'] = 1;
    mp['C'] = 2;
    cout << mp['C'] << endl;
    return 0;
}
  • 2.通过迭代器访问
     map迭代器的定义方式:
map<typename1, typename2>::iterator it;

通过使用it->first来访问键,通过it->second来访问值

#include<iostream>
#include<map>

using namespace std;

int main()
{
    map<char, int> mp;
    mp['C'] = 1;
    mp['B'] = 1;
    mp['A'] = 1;
    map<char, int>::iterator it;
    for(it = mp.begin(); it != mp.end(); it ++) 
    	cout << it->first << " " << it->second << endl;
    return 0;
}

 同时,map会以键从小到大的顺序自动排序,因为 map 内部是使用红黑树来实现(set也是),在建立映射的时候会自动实现从小到大的排序功能。

3.map 常用函数实例分析:

1. find()

find(key)返回键为 key 的映射的迭代器,时间复杂度为 O ( l o g N ) O(log^N) O(logN),N为map中的映射个数。例子:

#include<iostream>
#include<map>

using namespace std;

int main()
{
    map<char, int> mp;
    mp['C'] = 1;
    mp['B'] = 1;
    mp['A'] = 1;
    map<char, int>::iterator it = mp.find('A');
    cout << it->first << " " << it->second << endl;
    return 0;
}

如果find()没有找到相应的key,会返回mp.end()

2. erase()

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

删除单个元素有两种方法:

  • mp.erase(it) it 为需要删除元素的迭代器。时间复杂度为 O ( 1 ) O(1) O(1)
  • mp.erase(key) key为欲删除元素的键。时间复杂度为 O ( l o g N ) O(log^N) O(logN) N为map内元素的个数。

删除一个区间内所有的元素:
mp.erase(first, last),其中first为所要删除区间的起始迭代器,而last则为需要删除区间的末尾迭代器的下一个地址。删除左闭右开的区间[first, last),时间复杂度为 O ( l a s t − f i r s t ) O(last - first) O(lastfirst) 例子:

#include<iostream>
#include<map>

using namespace std;

int main()
{
    map<char, int> mp;
    mp['C'] = 1;
    mp['B'] = 1;
    mp['A'] = 1;
    map<char, int>::iterator it = mp.find('B');
    mp.erase(it, mp.end());
    for(auto it = mp.begin(); it != mp.end(); it++) cout << it->first << " " << it->second << endl;
    return 0;
}

输出: A 1

3. size()

 用来获得map中映射的对数,时间复杂度为 O ( 1 ) O(1) O(1)。例子:

#include<iostream>
#include<map>

using namespace std;

int main()
{
    map<char, int> mp;
    mp['C'] = 1;
    mp['B'] = 1;
    mp['A'] = 1;
    cout << mp.size() << endl;
    return 0;
}

输出:3

4. clear()

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

#include<iostream>
#include<map>

using namespace std;

int main()
{
    map<char, int> mp;
    mp['C'] = 1;
    mp['B'] = 1;
    mp['A'] = 1;
    cout << "before: "<< mp.size() << endl;
    mp.clear();
    cout << "after: " << mp.size() << endl;
    return 0;
}

输出:
before: 3
after: 0

4. map的常见用途:

  • 需要建立字符(或字符串)与整数之间映射的题目,使用map可以减少代码量。
  • 判断大整数或其他类型数据是否存在的题目,可以把map当作bool数组使用。
  • 字符串和字符串的映射。
      另外,map的键和值是唯一的,如果一个键要对应多个值,只能用multimap。另外C++中还增加了unordered_map,以散列代替map内部红黑树的实现,使其可以用来只映射不按照key排序的需求速度比map快很多。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值