关于c++:CSTL教程4map超强的容器它终于来了零基础都能理解的入门教程

33次阅读

共计 2333 个字符,预计需要花费 6 分钟才能阅读完成。

之前咱们介绍过vector, queue, stack,他们都有一个独特的特点,就是都能够用线性表来模仿。明天咱们来学习一个全新且高封装性的容器:map

🎈 作者:Eriktse
🎈 简介:19 岁,211 计算机在读,现役 ACM 银牌选手🏆力争以通俗易懂的形式解说算法!❤️欢送关注我,一起交换 C ++/Python 算法。(优质好文继续更新中……)🚀
🎈 集体博客:www.eriktse.com

什么是 map

std::map是 C ++ 规范库中的一个容器,数据以 <key, value> 的模式存储,也就是咱们常说的“键值对”模式,且其“键值对”是有序的,也就是能够程序遍历的。

这意味着一个 key 只能对应一个 value,而一个value 可能对应了多个key,其关系有点像高中学过的函数的关系。

map的底层个别实现为 红黑树,这个仅作理解即可。搜寻、移除和插入操作领有 log 级别复杂度。

初始化 map

首先引入头文件:

#include <map>

用以下代码申明一个空的map

map<int, string> mp;// 申明一个类型为 <int, string> 的 map

留神这里应用了string,也就须要引入头文件#include <string>

插入数据

map有一个函数是insert(),反对将数据插入。工夫复杂度O(logn),n 为 map 中已有的数据个数。

mp.insert({0, "张三"});// 插入一条数据

当然还有另外一种方法来插入数据,就是间接赋值,像操作数组一样操作 map,然而这个map 的下标可不是间断的,能够是任意符合条件的key

mp[2] = "李四";
// 当初 map 中的数据:{0: "张三", 2: "李四"}

可能会有小伙伴纳闷,这里没有 1 的吗?在这里 mapkey只有 int 类型即可,就算是正数都能够!

mp[-1] = "王五";
//mp = {-1: "王五", 0: "张三", 2: "李四"};

mp[-1] = "eriktse";
//mp = {-1: "eriktse", 0: "张三", 2: "李四"};

值得注意的是,value 可笼罩 的,且这里的 key有序 的,尽管我的 -1 这个 key 是前面退出的,然而却排在了第一个,如果程序遍历这个 mp 的话,{-1: "eriktse"}会是第一个被遍历到的。前面会讲到如何遍历map

删除数据 & 清空 map

erase(key)办法:删除 key 所对应的数据。工夫复杂度O(logn)

clear()办法:清空整个 map。

mp.earse(-1);
////mp = {0: "张三", 2: "李四"};

获取 map 大小(元素个数)

size()办法:返回 map 的大小,是一个非负整数。

查看容器是否无元素,即是否 begin() == end()

获取 map 中的数据

间接像用数组一样获取就行了。

mp[key]示意 map 中这个 key 所对应的value

cout << mp[0] << '\n';// 输入:张三

遍历输入 map

遍历 map 须要用到 std::iterator 迭代器,没有接触过的同学可能不太理解,能够先看代码,或者用第二种办法。

办法一:迭代器法

void print(map<int, string> mp)
{
    cout << '{';
    for(map<int, string>::iterator it = mp.begin(); it != mp.end(); ++ it)
    {
        cout << i.first << ":" << "\"" << i.second << "\"";
        if(next(it) != mp.end())cout << ",";// 这里的 next(it)示意 it 的下一个地位,留神这里不能用 + 1 运算,会报错
    }
    cout << '}';
}

在须要输入 map 的中央调用 print(mp) 即可。

办法二:auto关键字

void print(map<int, string> mp)
{
    cout << '{';
    for(auto &i : mp)
    {
        cout << i.first << ":" << "\"" << i.second << "\"";
        if(i != *mp.rbegin())cout << ",";
    }
    cout << '}';
}

对于 auto 关键字,在这篇文章开端有简略介绍:https://www.eriktse.com/algorithm/1051.html

判断某个 key 是否存在

count(key)能够返回 key 呈现的次数,然而在经典的 map 中一个 key 只能呈现一次,所以当返回值为 1 时阐明 key 存在,返回值为 0 阐明 key 不存在。工夫复杂度O(logn)

在容器 multimap 中一个 key 容许呈现屡次。

还可用 find() 函数判断。

find(key)返回一个迭代器示意找到的数据项,当找不到时返回end()

if(mp.count(x))cout << "mp 中存在 key == x 的项";
else cout << "mp 中不存在 key == x 的项";

if(mp.find(x) != mp.end())cout << "mp 中存在 key == x 的项";
else cout << "mp 中不存在 key == x 的项";

swap 办法

mp1.swap(mp2)办法:替换两个 map 容器。

看上面这个例子:

map<int, string> mp1, mp2;// 申明一个类型为 <int, string> 的 map
mp1.insert({0, "张三"});// 插入一条数据
mp1[2] = "李四";
mp1[-1] = "eriktse";

mp2[5] = "A";
mp1.swap(mp2);
//print 函数须要本人实现
print(mp1);// 输入:{5: "A"}

总结

map是 C ++ 中罕用的 stl 之一,也是算法比赛中的常客,大家肯定要牢牢记住 map 的用法、

🎈 本文由 eriktse 原创,创作不易,如果对您有帮忙,欢送小伙伴们点赞👍、珍藏⭐、留言💬

正文完
 0