• C++从零开始(day47)——set,map学习使用


    这是关于一个普通双非本科大一学生的C++的学习记录贴

    在此前,我学了一点点C语言还有简单的数据结构,如果有小伙伴想和我一起学习的,可以私信我交流分享学习资料

    那么开启正题

    今天分享的是关于set和map的知识点

    1.关联式容器

    在前面,我们已经学习了STL的部分容器,如vector,list,deque,这些容器被称为序列式容器,因为底层是线性序列的数据结构,里面存储的是元素本身,那么什么是关联式容器呢?

    关联式容器也是用来存储数据的,与序列式容器不同的是,其里面存储的是结构的键值对在数据检索时比序列式容器效率更高

    2.键值对

    键值对是用来表示具有一一对应关系的一种结构,该结构中一般只包含两个成员变量key和valuekey代表键值,value表示与key对应的信息

    如:假设我们现在要建立一个英汉互译的字典,那么该字典中必然有英文单词与其对应的信息,而且它们是一一对应的关系,即通过单词可以找到其对应的中文

    1. template<class T1, class T2>
    2. struct paic
    3. {
    4. typedef T1 first_type;
    5. typedef T2 second_tyde;
    6. T1 first;
    7. T2 second;
    8. paic()
    9. :first(T1())
    10. ,second(T2())
    11. {}
    12. paic(const T1& a, const T2& b)
    13. :first(a)
    14. ,frist(b)
    15. {}
    16. };

    3.树形结构的关联式容器

    根据应用场景不同,STL实现了两种不同结构的管理式容器,树型结构与哈希结构,树形结构的关联式容器主要有四种:map,set,multimap,multiset,这四种容器的公共特点是:使用平衡搜索树(即红黑树)作为其底层的结果,容器中的元素是一个有序的序列

    4.set

    4.1关于set

    1.与map/multimpa中存储真正的键值对不同,set中只放value,但在底层实际存放的是构成的键值对

    2.set中插入元素时,直接插入value即可,不需要构造键值对

    3.set中的元素不可以重复(multi_set不同),因此可以利用set进行去重

    4.使用set的迭代器遍历set的元素,可以得到有序序列

    5.set中查找元素的时间复杂度为:O(logN)

    6.set在底层是用二叉搜索树(红黑树)实现的

    4.2set的使用

    4.2.1set的构造

    1. set (const Compare& comp = Compare(), const Allocator&
    2. = Allocator() );
    3. //构造空的set
    4. set ( const set& x);
    5. //set的拷贝构造

    4.2.2set的修改操作

    1. pairbool> insert (
    2. const value_type& x )
    3. //在set中插入元素x,实际插入的是构成的
    4. 键值对,如果插入成功,返回<该元素在set中的
    5. 位置,true>,如果插入失败,说明x在set中已经
    6. 存在,返回false>
    7. void erase ( iterator position )
    8. //删除set中position位置上的元素
    9. void swap (
    10. set&
    11. st );
    12. //交换set中的元素
    13. void clear ( )
    14. //将set中的元素清空
    15. iterator find ( const
    16. key_type& x ) const
    17. //返回set中值为x的元素的位置

    4.2.3set的迭代器

    set迭代器用法很简单,这里不在给出,后面模拟实现再详细理解底层是如何实现的

    4.2.4举例代码

    1. void Print(set<int>& s)
    2. {
    3. set<int>::iterator it = s.begin();
    4. while (it != s.end())
    5. {
    6. cout << *it << " ";
    7. ++it;
    8. }
    9. cout << endl;
    10. }
    11. void Test_set1()
    12. {
    13. set<int> s;
    14. s.insert(1);
    15. s.insert(9);
    16. s.insert(3);
    17. s.insert(1);
    18. s.insert(1);
    19. Print(s);
    20. s.erase(1);
    21. Print(s);
    22. set<int>::iterator pos = s.find(5);
    23. s.erase(5);
    24. pos = find(s.begin(), s.end(), 5);
    25. if (pos != s.end())
    26. {
    27. s.erase(pos);
    28. }
    29. }

    5.map

    5.1关于map

    1.在map中,键值key通常用于排序和惟一地标识元素,而值value中存储与此键值key关联的 内容。键值key和值value的类型可能不同,并且在map的内部,key与value通过成员类型 value_type绑定在一起,为其取别名称为pair

    2.在内部,map中的元素总是按照键值key进行比较排序的

    3.map支持下标访问符,即在[]中放入key,就可以找到与key对应的value

    4.map通常被实现为二叉搜索树(红黑树)

    5.2的使用

    5.2.1map的构造

    map()       //构造一个空的map
    

    5.2.2map的容量与元素访问

    1. bool empty ( ) const
    2. //检测map中的元素是否为空,是返回
    3. //true,否则返回false
    4. size_type size() const
    5. //返回map中有效元素的个数
    6. mapped_type& operator[] (const
    7. key_type& k)
    8. //返回去key对应的value

    5.2.3map的修改操作

    1. pairbool> insert (
    2. const value_type& x )
    3. //在map中插入键值对x,注意x是一个键值
    4. 对,返回值也是键值对:iterator代表新插入
    5. 元素的位置,bool代表释放插入成功
    6. void erase ( iterator position )
    7. //删除position位置上的元素
    8. size_type erase ( const
    9. key_type& x )
    10. //删除键值为x的元素
    11. void erase ( iterator first,
    12. iterator last )
    13. //删除[first, last)区间中的元素
    14. void swap (
    15. map&
    16. mp )
    17. //交换两个map中的元素
    18. void clear ( )
    19. //将map中的元素清空
    20. iterator find ( const key_type& x
    21. )
    22. //在map中插入key为x的元素,找到返回该元
    23. 素的位置的迭代器,否则返回end

    5.2.4map的迭代器

    map迭代器用法很简单,这里不在给出,后面模拟实现再详细理解底层是如何实现的

    5.2.5举例代码

    1. void Test_map1()
    2. {
    3. mapint> m;
    4. m.insert(make_pair("苹果", 1));
    5. m.insert(make_pair("香蕉", 3));
    6. m.insert(make_pair("桃子", 5));
    7. m.insert(make_pair("樱桃", 4));
    8. mapint>::iterator it = m.begin();
    9. while (it != m.end())
    10. {
    11. cout << it->first << ":" << it->second << endl;
    12. ++it;
    13. }
    14. cout << endl;
    15. }

    新手写博客,有不对的位置希望大佬们能够指出,也谢谢大家能看到这里,让我们一起学习进步吧!

  • 相关阅读:
    python实现外参标定的思路
    数据可视化在行业解决方案中的实践应用 ——华为云Astro Canvas大屏开发研究及指南
    Baklib帮助中心:自助服务指南
    vue和react的生命周期
    熊市下的Coinbase:亏损、裁员、股价暴跌
    OpenStack Zed:新一代仪表盘 Skyline 正式发布
    大健康老年公寓管理系统设计与实现-计算机毕业设计源码+LW文档
    人大金仓(KingbaseES V9)的Python环境的配置和基本使用
    前端使用elementui开发后台管理系统的常用功能(持续更新)
    【入门-04】中断系统
  • 原文地址:https://blog.csdn.net/2301_80764270/article/details/136589243