• 关联容器(字典)map


    C++自学精简教程 目录(必读)

    map 在c++中翻译为映射。

    map 是STL(标准模板库)的一个关联容器(字典)。

    有序键(key)值(value)对容器

    map的键(key)是索引,不能重复,一个键(key)对应着一个值(value);

    value为关键字的值,可以重复。不同的学生学号不同,但是体重相同一样。

    map中的元素会自动排序(默认按照升序排序),并且增删改查整体上都很快。

    • 使用map必须包含头文件:
    #include
    

    map的定义与初始化

    格式为

    map myMap;

    其中, keyType为键的类型(这种类型要求能够比较大小)。

    其中,valuetype 为值的类型(没什么要求)。

    示例

    定义一个key和value的类型都是整数的map,存放学生的学号和成绩:

    1. map<int, int> student_score{
    2. //学号不可以有重复
    3. //学号可以不按顺序创建
    4. //学号在创建完成之后会在内部自动排好顺序
    5. //学号排序按照大小顺序,int类型的数据就按数值大小排序
    6. {003, 90},
    7. {004, 88},
    8. {001, 88},//分数可以有相同的分数
    9. {002, 78},
    10. };

    可以看出初始化map的时候,key并不是按照顺序创建的,但是创建完成以后在内存中的map(如上图)是排好顺序的。

    map的元素与遍历

    map的元素是一个key和一个value共同构成的组合体,这个组合体是一个pair 类型。

    pair 类型有两个成员:first,second。

    下面的例子先通过for循环遍历map,再用first和second访问元素的key和value。

    1. #include
    2. #include
    3. using namespace std;
    4. //本利中map的元素类型
    5. /*
    6. struct pair
    7. {
    8. int first;
    9. int second;
    10. };
    11. */
    12. int main(int argc, char** argv)
    13. {
    14. map<int, int> student_score{
    15. //学号不可以有重复
    16. //学号可以不按顺序创建
    17. //学号在创建完成之后会在内部自动排好顺序
    18. //学号排序按照大小顺序,int类型的数据就按数值大小排序
    19. {003, 90},
    20. {004, 88},
    21. {001, 88},//分数可以有相同的分数
    22. {002, 78},
    23. };
    24. //item变量来迭代student_score 的每一个元素
    25. for (auto item : student_score)
    26. {
    27. //item是一个pair类型
    28. cout << "id=" << item.first << " " << " score=" << item.second << endl;
    29. }
    30. return 0;
    31. }

    可见,输出的时候元素会按照顺序输出。

    访问元素

    下面的例子中,我们实现一个大学的简称和全称对应关系的map。

    key类型为string,value类型也为string:

    map universities;
    

    通过下标访问元素

    下面的下标访问会得到这个key对应的值value(值是一个变量)

    universities["MIT"];
    
    通过范围 for 循环访问元素

    下面的item会遍历到map的每一个元素。

    for(auto& item : universities);
    

    可以通过item.first 访问键,item.second 访问值。

    插入元素

    使用下标操作符插入元素
    universities["MIT"] = "麻省理工学院 Massachussets  Institute of Technology";
    

    上面的代码看起来是给元素赋值,实际上如果这个元素不存在会先创建这个元素(键值对)。所以,下标操作非常方便。

    但是,也可能会误加元素到map里。

    1. #include
    2. #include
    3. #include
    4. using namespace std;
    5. int main()
    6. {
    7. map universities;
    8. /*下面的代码完成了元素创建的工作,因为map中还没有这个元素
    9. */
    10. universities["MIT"] = "麻省理工学院 Massachussets Institute of Technology";
    11. cout <<"size="<< universities.size() << endl;//可见元素数量是1了
    12. cout << universities["MIT"] << endl;//可以取出这个key为“MIT”的元素的value并输出
    13. return 0;
    14. }

    输出:

    使用insert成员函数插入元素
    universities.insert({"MIT", "麻省理工学院 Massachussets  Institute of Technology"});
    

    效果和使用中括号版本相同:

    1. #include
    2. #include
    3. #include
    4. using namespace std;
    5. int main()
    6. {
    7. map universities;
    8. /*下面的代码,使用insert成员函数插入一个键值对
    9. */
    10. universities.insert({ "MIT", "麻省理工学院 Massachussets Institute of Technology" });
    11. cout <<"size="<< universities.size() << endl;
    12. cout << universities["MIT"] << endl;
    13. return 0;
    14. }

    完整的例子

    看下面的例子就明白了:

    1. #include
    2. #include
    3. #include
    4. using namespace std;
    5. //本利中map的元素类型
    6. /*
    7. struct pair
    8. {
    9. string first;
    10. string second;
    11. };
    12. */
    13. int main(int argc, char** argv)
    14. {
    15. //初始化map
    16. //map会自动对插入的元素按照key大小进行排序
    17. //这里key是string类型,所以使用string的小于号来排序
    18. //string的小于号比较大小按照ASCII码的字母表排序
    19. map universities{
    20. {"MIT", "麻省理工学院 Massachussets Institute of Technology"},
    21. {"UCB", "加州大学伯克利分校 University of California - Berkeley"},
    22. {"CMU", "卡内基梅隆大学 Carnegie Mellon University"},
    23. {"CC", "哥伦比亚大学 Columbia University /Community College"},
    24. {"CU", "康奈尔大学 Cornell University"},
    25. {"UNC", "北卡罗来纳大学 University of North Carolina - Chapel Hill"},
    26. {"UWM", "威斯康辛大学麦迪逊分校 University of Wisconsin - Madison"},
    27. {"GWU", "乔治华盛顿大学 George Washington University"},
    28. {"JHU", "约翰霍普金斯大学 Johns Hopkins University"},
    29. {"MSU", "密歇根州立大学 Michigan State University"},
    30. };
    31. //运行时根据业务需要,插入一条记录
    32. universities["Penn"] = "宾夕法尼亚大学 University of Pennsylvania";
    33. //按照字母表顺序输出所有大学
    34. cout << "All " << universities.size() << " universities:" << endl;
    35. for (auto& item : universities)
    36. {
    37. cout<<"key=" << item.first << " , value= " << item.second << endl;
    38. }
    39. return 0;
    40. }

    程序输出

    可以看出:

    • map的每一个元素包括两部分key和value;
    • key在插入后就不再可以改变,可以被删除(同时对应的value一起被删除);
    • key对应的value可以被访问和读写;
    • map使用中括号[]操作符来获取key对应的value;
    • map的元素在插入的过程中会自动排序(使用小于号<对元素按照key排序)。

    更全面的介绍参考:map - C++ Reference

    multimap

    标准库同时还提供了key可以重复的关联容器multimap,参考:

    multimap::erase - C++ Reference

  • 相关阅读:
    四川易点慧电子商务抖音小店:安全正规,购物新选择
    【高性能计算】CUDA,OpenCL,FPGA 加速,MPI
    已解决TypeError: __init__() missing 1 required positional argument: ‘scheme‘
    Scala 高阶(九):Scala中的模式匹配
    JAVA IDEA 项目打包为 jar 包详解
    1. 内核镜像组成及编译
    pthead 创建与销毁详解 pthread_create pthread_join pthread_exit pthread_detach
    【深度学习】 Python 和 NumPy 系列教程(八):Python类
    学会 Arthas,让你 3 年经验掌握 5 年功力!
    LeetCode //C - 18. 4Sum
  • 原文地址:https://blog.csdn.net/ClamReason/article/details/126681383