【C++ STL】细数C++ STL 的那些事---map容器

2024-04-05 01:48
文章标签 c++ 容器 map stl 细数

本文主要是介绍【C++ STL】细数C++ STL 的那些事---map容器,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

MAP容器

        1)概念:map 是一个容器,它用于储存数据并且能从一个数据集合中取出数据。它的数据组成包含两项,一个是它的数据值,一个是用于排序的关键字。其中关键字是惟一的,它用于将数据自动排序。而每个元素的数据值与关键字无关,可以直接改变。

         

            【重点】内部结构采用RB_TREE(红黑树)。查找复杂度:O(log2N)     

        

              multimap 跟map 特性相同,唯一的区别是允许键值重复!!!

        2)使用

             需加载的头文件:   #include<map>
                                          using namespace std;
            模板原型:
                  template <
                  class Key,                          //关键字的数据类型
                  class Type,                       //数据值的数据类型
                  class Traits = less<Key>, //提 供 比 较 两 个 元 素 的 关 键 字 来 决 定 它 们 在 map容器中的相对位置。它是可选的,它的默认值是 less<key>
                  class Allocator=allocator<pair <const Key, Type> >  //代表存储管理设备。它是可选的,它的默认值为allocator<pair <const Key, Type> >
                   >


        3)map 容器特点:
               (1)是一个相关联的容器,它的大小可以改变,它能根据关键字来提高读取数据能力。
               (2)提供一个双向的定位器来读写取数据。
               (3)已经根据关键字和一个比较函数来排好序
               (4)每一个元素的关键字都是惟一的。
               (5)是一个模板,它能提供一个一般且独立的数据类型。

        4)有关map最详细的介绍详见资源

              STL MAP详细资源下载

        5)结合map方法给出了一个综合测试代码:

#include <cstdlib>
#include <map>
#include <iostream>
using namespace std;map <int,char> ctr;int print_one_item(map <int,char>::const_iterator cp)//用于打印 map 的一个元素
{cout<<"("<<cp->first<<" , "<<cp->second<<") ";return 0;
}void test_equal_range()//测试equal_range()的功能
{//pair第一个迭代器返回第一个大于或等于给定的关键字的元素  //pair第二个迭代器返回第一个比给定的关键字大的元素。pair <map <int,char>::const_iterator, map <int,char>::const_iterator> p;p=ctr.equal_range(2);if(p.first!=ctr.end()){cout<<"The first element which key >= 2 is: ";//cout<<"("<<p.first->first<<" , "<<p.first->second<<") ";print_one_item(p.first); //调用子程序来打印一项cout<<endl;}if(p.second!=ctr.end()){cout<<"The first element which key > 2 is: ";cout<<"("<<p.second->first<<" , "<<p.second->second<<") ";cout<<endl;}}void creat_map()
{ctr.insert(pair <int,char>(1,'a'));ctr.insert(pair <int,char>(2,'b'));ctr.insert(pair <int,char>(3,'b'));ctr.insert(pair <int,char>(4,'c'));ctr.insert(pair <int,char>(5,'d'));ctr.insert(pair <int,char>(1,'c'));
}void erase_map()//删除某一个元素
{map <int,char>::iterator cp=ctr.find(2);ctr.erase(cp);//删除关键值等于 2 的元素
}void clear_map()
{ctr.clear();//清空 map 容器(删除全部元素)if(ctr.empty())//map 容器为空时cout<<"The container is empty"<<endl;elsecout<<"The container is not empty"<<endl;
}int print()//用于打印一个 map 容器
{map<int,char>::const_iterator cp;for(cp=ctr.begin();cp!=ctr.end();cp++)//让 cp 从 c 的开始到结束打印 cp 对应的值print_one_item(cp); //调用子程序来打印一个元素return 0;
}void print_first_element()
{map <int,char>::iterator cp;//迭代器cp=ctr.begin(); //定位到 ctr 的开始位置cout<<"The first element is:"<<cp->second<<endl;//打印出第一个元素
}
void key_compare_map() //key_comp取得一个比较对象的副本以对 map 容器中的元素进行排序。
{map <int,int> c;map <int, int, less<int> >::key_compare kc = c.key_comp() ;if(kc( 1, 2 ))cout<<"kc(1,2) is true"<<endl;elsecout<<"kc(1,2) is false"<<endl;if(kc( 2, 1 ))cout<<"kc(2,1) is true"<<endl;elsecout<<"kc(2,1) is false"<<endl;
}
void lower_bound_map()
{map <int,char>::iterator cp;/* 返回一个指向第一个关键字的值是大于等于一个给定值的元素的定位器,或者返回指向 map 容器的结束的定位器*/cp=ctr.lower_bound(2);//返回第一个 大于等于2的元素的定位器if(cp!=ctr.end()){cout<<"The first element which key >= 2 is: ";print_one_item(cp);//调用子程序来打印一项cout<<endl;}}void compare_map()
{map <int,char> ctr1,ctr2;int i;for(i=0;i<3;i++){ctr1.insert(pair <int,char>(i,'a'+i));ctr2.insert(pair <int,char>(i,'A'+i));}if(ctr1!=ctr2)//当 ctr1 与 ct2 不同时cout<<"They are not equal"<<endl;else//当 ctr1 与 ctr2 相同时cout<<"They are equal"<<endl;}
void comp_map()//两个 map 容器的大小比较是基于第一个不相同的元素的大小比较。
{              //两个 map 容器相等,当且仅当它们的元素个数相等且同一个位置上的值相等map <int,char> ctr1,ctr2;int i;for(i=0;i<3;i++)//下面给 ctr1 和 ctr2 赋值{ctr1.insert(pair <int,char>(i,i));ctr2.insert(pair <int,char>(i,i+1));}if(ctr1<ctr2)      cout<<"ctr1<ctr2"<<endl;elsecout<<"ctr1>=ctr2"<<endl;       
}void reverse_map()//打印 反向 map  rbegin() rend()跟 reverse_iterator同时使用
{map <int,char>::reverse_iterator rcp;for(rcp=ctr.rbegin();rcp!=ctr.rend();rcp++)cout<<"("<<rcp->first<<" , "<<rcp->second<<") ";}void swap_map()
{map <int,int> ctr1, ctr2;map <int,int>::const_iterator cp;int i;for(i=0;i<3;i++)//下面先给 ctr1 和 ctr2 赋值{ctr1.insert(pair <int,int>(i,i));ctr2.insert(pair <int,int>(i,i+10));}cout<<"Before exchange with ctr2 the ctr1 is:";for(cp=ctr1.begin();cp!=ctr1.end();cp++)//让 cp 从 c 的开始到结束打印 cp 对应的值cout<<"("<<cp->first<<" , "<<cp->second<<") ";cout<<endl;cout<<"After exchange with ctr2 the ctr1 is:";ctr1.swap(ctr2);//让 ctr1 的内容与 ctr2 交换for(cp=ctr1.begin();cp!=ctr1.end();cp++)//让 cp 从 c 的开始到结束打印 cp 对应的值cout<<"("<<cp->first<<" , "<<cp->second<<") ";cout<<endl;
}
int main()
{creat_map();int i;cout<<"1,测试begin()"<<endl;cout<<"2,测试count()求某关键字个数"<<endl;cout<<"3,测试test_equal_range()"<<endl;cout<<"4,测试erase()"<<endl;cout<<"5,测试key_compare_map()"<<endl;cout<<"6,测试lower_bound_map()"<<endl;cout<<"7,测试map size和 max_size(最大可能长度)"<<endl;cout<<"8,测试符号 [] 的作用"<<endl;cout<<"9,测试符号 != 的作用"<<endl;cout<<"10,测试符号 <  的作用"<<endl;cout<<"11,打印反向map"<<endl;cout<<"12,交换两个map 的值"<<endl;while(1){       cin>>i;switch(i){case 1: print_first_element(); break;case 2: int j;j=ctr.count(1);//求出关键字为 1 的元素的个数(由于map 容器的关键字是惟一的,故它只能取 0 或者 1)cout<<"The number of key 1 is: "<<j<<endl;break;case 3: test_equal_range(); break;case 4: erase_map();break;case 5: key_compare_map();break;case 6: lower_bound_map();break;case 7: cout<<"the size of ctr is:"<<ctr.size()<<endl;cout<<"the max_size of ctr is:"<<ctr.max_size()<<endl;break;case 8: cout<<"before change map is:"<<endl;print();ctr[1]='W';//将关键字为 1的对应值变为 Wctr[7];    //添加一个关键字为7 值为0的项cout<<"\nafter change map is:"<<endl;print();break;case 9:compare_map();break;case 10:comp_map();break;case 11:reverse_map();break;case 12:swap_map(); break;}}map <int,char>::iterator end;//迭代器end=ctr.end();               //这里定位到Map 中最后一个元素后面位置,所以什么都不打印//end--;//这定位到最后一个元素 d  除去了重复关键字 c   cout<<"The last element is:"<<end->second<<endl;clear_map();return 0;
}

 再看一个map数据结构的应用(统计每个字符串出现的个数)

#include <iostream>
#include <map>
using namespace std;
int main()
{map <string ,int> M;map <string ,int>::iterator j;string t[5]={"abc","dd","abc","dd","dd"};for(int i=0;i<5;++i)M[t[i]]++;//默认是表示第二个值  而不是键for(j=M.begin();j!=M.end();++j)cout<<"<"<<j->first<<" ,"<<j->second<<">"<<endl;return 0;
}


这篇关于【C++ STL】细数C++ STL 的那些事---map容器的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/877359

相关文章

深入理解C++ 空类大小

《深入理解C++空类大小》本文主要介绍了C++空类大小,规定空类大小为1字节,主要是为了保证对象的唯一性和可区分性,满足数组元素地址连续的要求,下面就来了解一下... 目录1. 保证对象的唯一性和可区分性2. 满足数组元素地址连续的要求3. 与C++的对象模型和内存管理机制相适配查看类对象内存在C++中,规

在 VSCode 中配置 C++ 开发环境的详细教程

《在VSCode中配置C++开发环境的详细教程》本文详细介绍了如何在VisualStudioCode(VSCode)中配置C++开发环境,包括安装必要的工具、配置编译器、设置调试环境等步骤,通... 目录如何在 VSCode 中配置 C++ 开发环境:详细教程1. 什么是 VSCode?2. 安装 VSCo

C++11的函数包装器std::function使用示例

《C++11的函数包装器std::function使用示例》C++11引入的std::function是最常用的函数包装器,它可以存储任何可调用对象并提供统一的调用接口,以下是关于函数包装器的详细讲解... 目录一、std::function 的基本用法1. 基本语法二、如何使用 std::function

【C++ Primer Plus习题】13.4

大家好,这里是国中之林! ❥前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。有兴趣的可以点点进去看看← 问题: 解答: main.cpp #include <iostream>#include "port.h"int main() {Port p1;Port p2("Abc", "Bcc", 30);std::cout <<

C++包装器

包装器 在 C++ 中,“包装器”通常指的是一种设计模式或编程技巧,用于封装其他代码或对象,使其更易于使用、管理或扩展。包装器的概念在编程中非常普遍,可以用于函数、类、库等多个方面。下面是几个常见的 “包装器” 类型: 1. 函数包装器 函数包装器用于封装一个或多个函数,使其接口更统一或更便于调用。例如,std::function 是一个通用的函数包装器,它可以存储任意可调用对象(函数、函数

C++11第三弹:lambda表达式 | 新的类功能 | 模板的可变参数

🌈个人主页: 南桥几晴秋 🌈C++专栏: 南桥谈C++ 🌈C语言专栏: C语言学习系列 🌈Linux学习专栏: 南桥谈Linux 🌈数据结构学习专栏: 数据结构杂谈 🌈数据库学习专栏: 南桥谈MySQL 🌈Qt学习专栏: 南桥谈Qt 🌈菜鸡代码练习: 练习随想记录 🌈git学习: 南桥谈Git 🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈�

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

06 C++Lambda表达式

lambda表达式的定义 没有显式模版形参的lambda表达式 [捕获] 前属性 (形参列表) 说明符 异常 后属性 尾随类型 约束 {函数体} 有显式模版形参的lambda表达式 [捕获] <模版形参> 模版约束 前属性 (形参列表) 说明符 异常 后属性 尾随类型 约束 {函数体} 含义 捕获:包含零个或者多个捕获符的逗号分隔列表 模板形参:用于泛型lambda提供个模板形参的名

6.1.数据结构-c/c++堆详解下篇(堆排序,TopK问题)

上篇:6.1.数据结构-c/c++模拟实现堆上篇(向下,上调整算法,建堆,增删数据)-CSDN博客 本章重点 1.使用堆来完成堆排序 2.使用堆解决TopK问题 目录 一.堆排序 1.1 思路 1.2 代码 1.3 简单测试 二.TopK问题 2.1 思路(求最小): 2.2 C语言代码(手写堆) 2.3 C++代码(使用优先级队列 priority_queue)

【C++高阶】C++类型转换全攻略:深入理解并高效应用

📝个人主页🌹:Eternity._ ⏩收录专栏⏪:C++ “ 登神长阶 ” 🤡往期回顾🤡:C++ 智能指针 🌹🌹期待您的关注 🌹🌹 ❀C++的类型转换 📒1. C语言中的类型转换📚2. C++强制类型转换⛰️static_cast🌞reinterpret_cast⭐const_cast🍁dynamic_cast 📜3. C++强制类型转换的原因📝