C++ STL容器之map容器快速入门

发布于 2020-02-09  95 次阅读


在定义一个浮点型数组时,其实是定义了一个int型到double型的映射。如array[0]=25.4就是将0映射到25.4。

但当要用数组来表示字符串映射到页码的关系时,就不好操作。因此引进map容器。

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

同样,如果需要判断给定的一些数字(大整型数字)在某个文件中是否出现过,也可以使用map容器简历string至int的映射。

使用map需于代码头部添加#include<map>,并且随后加上一句:using namespace std;即可。

map的定义

仅定义:map<typename1,typename2> mp;
前一个是键(Key)的类型,后一个是值(Value)的类型。

注意:(1)若是字符串映射到整型,则必须用string而不能用char数组,如map<string,int> mp;
(2)若键也是STL容器(STL容器嵌套),则需要在>>后加上空格(C++11之前标准的编译会将其视为移位操作)。即map<set<int>, int> mp;,此处是将一个set容器映射到字符串。

map容器内元素的访问

通过下标访问(跟访问普通数组一样)

通过迭代器(类似指针)访问

定义:map<typename1, typename2>::iterator it;
map迭代器的使用方式和其他STL容器的使用方式不同。
map可以使用it->first来访问键,使用it->second来访问值

查找元素(通过迭代器查找)

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

map<char, int>::iterator it = mp.find('c');
prinf("%c %d\n", it -> first, it -> second);//输出c 30

删除元素

删除单个元素(通过迭代器删除)

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

    map<char, int>::iterator it = mp.find('m');
    mp.erase(it);//删除m 20

删除单个元素(通过键删除)

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

mp.erase('r');//删除r 30

删除一个区间内的所有元素

mp.erase(first,last):first为需要删除的区间的起始迭代器,last为需要删除的区间的末尾迭代器的下一个地址,即为删除左闭右开的区间[first,last),时间复杂度为O(last-first)。

    map<char, int>::iterator it3 = mp.find('y');
    mp.erase(it3,mp.end());//删除it之后的所有映射,即y 25和z 10

清空元素

clear(),时间复杂度为O(N),N为map中元素的个数

mp.clear();

获取长度

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

printf("%d\n",mp.size());

代码:

#include<stdio.h>
#include<map>
using namespace std;
int main(){
    map<char, int>mp;
    //通过下标访问元素
    mp['c'] = 20;
    mp['c'] = 30;//被覆盖
    printf("%d\n",mp['c']);
    //通过迭代器访问
    mp['z'] = 10;
    mp['y'] = 25;
    mp['m'] = 20;
    mp['r'] = 30;
    mp['a'] = 40;
    for(map<char, int>::iterator it = mp.begin();it != mp.end(); it++){
        printf("c %d\n",it -> first, it -> second);
        //只有vector和string中,才允许使用迭代器加上整数的写法
        //map会以键从小到大自动排序(因为map和set内部是使用红黑树实现的)
    }

    //查找元素(迭代器)
    //find(key):返回键为key的迭代器,时间复杂度为O(logN),N为map中映射的个数
    map<char, int>::iterator it1 = mp.find('c');
    prinf("%c %d\n", it1 -> first, it1 -> second);//输出c 30

    //删除单个元素
    //mp.erase(it),it为需要删除的元素的迭代器,时间复杂度为O(1)
    map<char, int>::iterator it2 = mp.find('m');
    mp.erase(it2);//删除m 20

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

    //删除一个区间内的所有元素
    //mp.erase(first,last)
    //first为需要删除的区间的起始迭代器,last为需要删除的区间的末尾迭代器的下一个地址
    //即为删除左闭右开的区间[first,last),时间复杂度为O(last-first)
    map<char, int>::iterator it3 = mp.find('y');
    mp.erase(it3,mp.end());//删除it之后的所有映射,即y 25和z 10

    //清空元素:clear(),时间复杂度为O(N),N为map中元素的个数
    mp.clear();

    //获取长度:size()用来获得map中映射的对数,时间复杂度为O(1)
    //printf("%d\n",mp.size());//输出2,表明还剩2对映射
}

常见用途

需要建立字符或字符串与整数之间映射的题目

判断大整数或者其他类型数据是否存在的问题,可以把map当成bool数组用

字符串和字符串的映射也有可能会用到

延伸

(1)如果一个键需要对应多个值,只能使用multimap而不能使用map。
(2)C++11标准还增加了unordered_map,以散列替代map内部的红黑树实现,使其可以用来处理值只映射而不按key排序的需求,速度比map快很多。

本文标题:《C++ STL容器之map容器快速入门》

本文链接:https://wnag.com.cn/298.html

特别声明:除特别标注,本站文章均为原创,本站文章原则上禁止转载,如确实要转载,请电联:wangyeuuu@qq.com,尊重他人劳动成果,谢过~


正因为有要好好实现的梦想,所以今天也要好好加油。