• 【C++】map容器


    更明确的类型重命名规则using

    在C语言中typedef将一个变量提升为一种类型:

    1. typedef int * p;//p是int*类型
    2. //int Array[10];//Array是一个可装10个int类型变量的数组。
    3. typedef int Array[10];//Array是一个可装10个int类型变量的数组的类型
    4. //Array arr;
    5. //sizeof(Array)//40

    在C++中提供了更明确的类型重命名规则using

    上面两种类型重命名可以改成:

    1. using p = int*;
    2. using Array = int[10];

    using可以很方便的定义两种类型的集合,如下,将My_Pair的键值对两个类型定义成一个value_type。

    1. template<class _T1, class _T2>
    2. struct My_Pair
    3. {
    4. using first_type = _T1;
    5. using second_type = _T2;
    6. first_type first;
    7. second_type second;
    8. };
    9. template<class _Key, class _Ty>
    10. class My_Map
    11. {
    12. public:
    13. using value_type = My_Pair<_Key, _Ty>;
    14. value_type data;
    15. };

            value_type是两种类型的集合,使用时给两个类型。

    My_Mapint>simap;

    map容器

            map是C++ STL库中的一个关联式容器,其元素是一对键值对(key-value),可通过键查找值。其中,键和值可以是任意类型,但键必须是唯一的。map中的元素按照键的大小自动排序,因此可以快速地查找、插入和删除元素。map是一个非常常用的容器,常用于需要按照键进行查找的场合。

             map的底层是红黑树, 红黑树具有良好的效率,它可在 O(logN) 时间内完成查找、增加、删除等操作。红黑树是一种接近平衡的二叉树。

            map里面存的是pair,pair有first键和second值两个成员。

    创建一个map容器

    1. mapint> simap;
    2. /*这样写更方便*/
    3. using NAMap = mapint>;
    4. NAMap sm; //创建容器
    5. sm.insert(NAMap::value_type("xiaoming", 20));//插入数据

    插入数据

    方法一insert

            容器名.insert(map<键类型,值类型>::value_type(键,值));

    1. // 类型加括号,调用构造函数
    2. simap.insert(mapint>::value_type("xiaoming", 20));
    3. //map不允许关键码重复
    4. simap.insert(mapint>::value_type("小红", 20));
    5. simap.insert(mapint>::value_type("小华", 20));

    方法二operator[]

            输入的数据放到红黑树中,若红黑树有name(name输入重复了),用age替换原有的;没有,建立结点key = name,val = age;

    1. string name;
    2. int age;
    3. while (cin >> name >> age, name != "end")
    4. {
    5. simap[name] = age;//重载[]直接赋值
    6. for (auto& x : simap)//输出数据
    7. {
    8. cout << x.first << " " << x.second << endl;
    9. }
    10. }

    输出map中的数据

    方法一:范围for

            auto根据实际值推演出变量类型,const防止值被修改,&引用赋值不构建将亡值更快。

    1. for (const auto& x : simap)//范围for
    2. {
    3. cout << x.first << " " << x.second << endl;
    4. }

    方法二:迭代器iterator输出

            创建map迭代器指向map中第一个值

    	mapint>::iterator it = simap.begin();

    也可以用auto自动识别map的类型创建迭代器auto it = simap.begin();//这样写更方便

    1. for (; it != simap.end(); it++)
    2. {
    3. cout << it->first << " " << it->second << endl;
    4. }

    用键查询值

    1. string name;
    2. while (cin >> name, name != "end")
    3. {
    4. try
    5. {
    6. auto x = simap.at(name);//at()相当于数组下标,但是比[]更安全
    7. cout << typeid(x).name() << endl;//运行时类型识别RTTI,输出类型
    8. cout << x << endl;//输出值
    9. }
    10. catch (std::out_of_range& e)//捕获超出范围的异常
    11. {
    12. cout << e.what() << endl;
    13. }
    14. }

  • 相关阅读:
    使用 MAUI 在 Windows 和 Linux 上绘制 PPT 的图表
    程序的编译汇编和链接
    容易忘记的css样式
    10个PyCharm常用的免费插件,让开发迅速飙升
    ipad分享软件的方法,iphone怎么分享给ipad
    Java 面试题一
    【牛客 - 剑指offer】JZ28 对称的二叉树 两种方案 Java实现
    绝地求生:PCL2024春季赛第二轮D2:MnG极致运营,206分登顶榜首
    使用python压缩文件夹
    python419社区疫情综合管理系统django
  • 原文地址:https://blog.csdn.net/l203018/article/details/130895256