C/C++算法编程竞赛标准模板库(STL)篇:map(映射)

目录

前言

这个栏目是对我算法学习过程的同步记录,我也希望能够通过这个专栏加深自己对编程的理解以及帮助到更多像我一样想从零学习算法并参加竞赛的同学。在这个专栏的文章中我会结合在编程过程中遇到的各种问题并提出相应的解决方案。当然,如果屏幕前的你有更好的想法或者发现的错误也欢迎交流和指出!不喜勿喷!不喜勿喷!不喜勿喷!这章的内容比较重要!那么事不宜迟,我们马上开始吧!

一、map

1.简要介绍

2.map的定义和结构

3.map的常用函数表

二、multimap

1.基本介绍

三、unordered_map

1.基本介绍

四、代码示例

1.map

2.multimap

3.unordered_map

总结

我也从没想过STL中的set还有这么多的花样。总而言之,如果你觉得这篇文章还不错,劳烦多多支持一下!码字不易,感谢你的观看!



前言

这个栏目是对我算法学习过程的同步记录,我也希望能够通过这个专栏加深自己对编程的理解以及帮助到更多像我一样想从零学习算法并参加竞赛的同学。在这个专栏的文章中我会结合在编程过程中遇到的各种问题并提出相应的解决方案。当然,如果屏幕前的你有更好的想法或者发现的错误也欢迎交流和指出!不喜勿喷!不喜勿喷!不喜勿喷!这章的内容比较重要那么事不宜迟,我们马上开始吧!

一、map

1.简要介绍

map是一种关联容器,用于存储一对键值对(key-value pairs),其中每个键(key)都是唯一的。map容器根据键自动排序,并且可以通过键来快速查找值。map容器使用红黑树(Red-Black Tree)数据结构来实现,具有较快的插入、删除和查找速度。

以下是映射的示意图(这里以ASCII码表为例):

2.map的定义和结构

map的定义和结构如下所示:

template <class Key, class T, class Compare = less<Key>,
          class Allocator = allocator<pair<const Key, T>>> 

(1)Key:表示存储在map中的键(Key)的类型。

(2)T:表示存储在map中的值(Value)的类型。

(3)Compare:表示用比较键的函数类型,默认为less,使用键类型的默认比较函数

(4)Allocator:表示用于分配内存的分配器类型,默认为allocator。

3.map的常用函数表

map的常用函数表如下所示:

函数功能时间复杂度
insert插入元素O(logn)
erase(key)删除元素O(logn)
find(key)查找元素O(logn)
count(key)统计元素个数O(logn)
size返回元素个数O(1)
begin返回指向容器起始位置的迭代器O(1)
end返回指向容器末尾位置的迭代器O(1)
clear清空容器O(1)
empty判断容器是否为空O(1)
lower_bound返回第一个不小于指定键的元素位置O(logn)
upper_bound返回第一个大于指定键的元素位置O(logn)

二、multimap

1.基本介绍

multimap是一种关联容器,类似于map但允许存储多个具有相同键的键值对。在实际做题中,我们几乎不会使用这一类型。感兴趣的同学可以自行了解,这里不再赘述。

三、unordered_map

1.基本介绍

unordered_map是一种关联容器。与map类似,其中每个键都是唯一的。但是特殊的是其不会按照剪的顺序进行排序,而是使用哈希函数将键映射到存储桶中。因此unordered_map具有更优秀的插入、删除和查找操作的平均时间复杂度,但不保证元素的顺序。unordered_map具有极好的平均时间复杂度和极差的最坏时间复杂度,一般情况下我们会更加愿意使用复杂度稳定的map而非unordered_map。

四、代码示例

1.map

代码如下:

#include <bits/stdc++.h>
using namespace std; 

int main()
{
    ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
    map<int, string> map1 = { {1,"Apple"},{2,"Banana"},{3,"Orange"} };

    //插入元素
    map1.insert(make_pair(4, "Grapes"));

    //查找和访问元素
    cout << "Value at Key2: " << map1[2] << "\n";

    //遍历并打印map中的元素
    for (const auto& pair : map1) {
        cout << "Key: " << pair.first << ", Value: " << pair.second << "\n";
    }

    //删除元素
    map1.erase(3);

    //判断元素是否存在
    if (map1.count(3) == 0)cout << "Key3 not found." << "\n";

    //清空map
    map1.clear();

    //判断map是否为空
    if (map1.empty())cout << "map1 is empty." << "\n";    
    return 0;
}

输出结果为:

Value at Key2: Banana
Key: 1, Value: Apple
Key: 2, Value: Banana
Key: 3, Value: Orange
Key: 4, Value: Grapes
Key3 not found.
map1 is empty.

2.multimap

代码如下:

#include <bits/stdc++.h>
using namespace std; 

int main()
{
    ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
    multimap<int, string> map1 = { {1,"Apple"},{2,"Banana"},{2,"Orange"} };

    //插入元素
    map1.insert(make_pair(4, "Grapes"));

    //查找和访问元素
    auto range = map1.equal_range(2);
    for (auto it = range.first; it != range.second; ++it) {
        cout << "Key: " << it->first << ", Value: " << it->second << "\n";
    }

    //遍历并打印map中的元素
    for (const auto& pair : map1) {
        cout << "Key: " << pair.first << ", Value: " << pair.second << "\n";
    }

    //删除元素
    map1.erase(2);

    //判断元素是否存在
    if (map1.count(2) == 0)cout << "Key2 not found." << "\n";

    //清空map
    map1.clear();

    //判断map是否为空
    if (map1.empty())cout << "map1 is empty." << "\n";    
    return 0;
}

输出结果为:

Key: 2, Value: Banana
Key: 2, Value: Orange
Key: 1, Value: Apple
Key: 2, Value: Banana
Key: 2, Value: Orange
Key: 4, Value: Grapes
Key2 not found.
map1 is empty.

3.unordered_map

代码如下:

#include <bits/stdc++.h>
#include <unordered_map>
using namespace std; 

int main()
{
    ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
    unordered_map<string, int> map1 = { {"Apple",3},{"Banana",5},{"Orange",2}};

    //插入元素
    map1.insert(make_pair("Grapes",4));

    //查找和访问元素
    cout << "Value for key 'Banana': " << map1["Banana"] << "\n";

    //遍历并打印map中的元素
    for (const auto& pair : map1) {
        cout << "Key: " << pair.first << ", Value: " << pair.second << "\n";
    }

    //删除元素
    map1.erase("Orange");

    //判断元素是否存在
    if (map1.count("Orange") == 0)cout << "Key'Orange' not found." << "\n";

    //清空map
    map1.clear();

    //判断map是否为空
    if (map1.empty())cout << "map1 is empty." << "\n";    
    return 0;
}

输出结果为:

Value for key 'Banana': 5
Key: Apple, Value: 3
Key: Banana, Value: 5
Key: Orange, Value: 2
Key: Grapes, Value: 4
Key'Orange' not found.
map1 is empty.


总结

我也从没想过STL中的set还有这么多的花样。总而言之,如果你觉得这篇文章还不错,劳烦多多支持一下!码字不易,感谢你的观看!
  • 32
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值