STL之map容器代码详解

news2024/9/22 15:34:19

基础概念

在这里插入图片描述
简介:

  • map中所有元素都是pair。
  • pair中第一个元素为key(键值),起到索引作用,第二个元素为value(实值)。
  • 所有元素都会根据元素的键值自动排序。

本质:

map/multimap属于关联式容器,底层结构是用二叉树实现。

优点:

可以根据key值快速找到value值。

map和multimap区别

map不允许容器中有重复key值元素;

multimap允许容器中有重复key值元素。

代码示例

Talk is cheap, show me the code.

#include<iostream>
using namespace std;
#include<map>

void printMap(const map<int, int>& mm)
{
	for (map<int, int>::const_iterator it = mm.begin(); it != mm.end(); it++)
	{
		cout << "Key is: " << (*it).first << "Value is: " << (*it).second << endl;
	}
}

/*
构造:
map<T1, T2> mp; //map默认构造函数:
map(const map &mp); //拷贝构造函数
赋值:
map& operator=(const map &mp); //重载等号操作符
*/

void test01()
{
	map<int, int> mp;
	mp.insert(pair<int, int>(1, 10));
	mp.insert(pair<int, int>(2, 20));
	mp.insert(pair<int, int>(3, 30));
	mp.insert(pair<int, int>(4, 40));

	printMap(mp);

	map<int, int> mp2(mp);
	printMap(mp2);

	map<int, int> mp3;
	mp3 = mp2;
	printMap(mp3);
}

/*
大小和交换函数原型:
size(); //返回容器中元素的数目
empty(); //判断容器是否为空
swap(st); //交换两个集合容器
*/

void test02()
{
	map<int, int> mp;
	mp.insert(pair<int, int>(1, 10));
	mp.insert(pair<int, int>(2, 20));
	mp.insert(pair<int, int>(3, 30));
	mp.insert(pair<int, int>(4, 40));

	printMap(mp);

	if (mp.empty())
	{
		cout << "Empty!" << endl;
	}
	else
	{
		cout << mp.size() << endl;
	}

	map<int, int> mp2;
	mp2.insert(pair<int, int>(5, 50));
	cout << "Swap Before: " << endl;
	printMap(mp);
	printMap(mp2);
	cout << "Swap After: " << endl;
	mp.swap(mp2);
	printMap(mp);
	printMap(mp2);
}

/*
插入和删除函数原型:
insert(elem); //在容器中插入元素。
clear(); //清除所有元素
erase(pos); //删除pos迭代器所指的元素,返回下一个元素的迭代器。
erase(beg, end); //删除区间[beg,end)的所有元素 ,返回下一个元素的迭代器。
erase(key); //删除容器中值为key的元素。
*/

void test03()
{
	map<int, int> mp;
	mp.insert(pair<int, int>(1, 10));
	mp.insert(pair<int, int>(2, 20));
	mp.insert(pair<int, int>(3, 30));
	mp.insert(pair<int, int>(4, 40));
	printMap(mp);

	map<int, int>::iterator it = mp.begin();
	mp.erase(it);
	printMap(mp);

	mp.erase(3);
	printMap(mp);

	mp.erase(mp.begin(), mp.end());
	printMap(mp);
}

/*
map查找和统计函数原型:
find(key); //查找key是否存在,若存在,返回该键的元素的迭代器;若不存在,返回set.end();
count(key); //统计key的元素个数
*/

void test04()
{
	map<int, int> mp;
	mp.insert(pair<int, int>(1, 10));
	mp.insert(pair<int, int>(2, 20));
	mp.insert(pair<int, int>(3, 30));
	mp.insert(pair<int, int>(4, 40));
	printMap(mp);

	if (mp.find(3)!=mp.end())
	{
		cout << "Exists: " << (*mp.find(3)).second << endl;
	}
	else
	{
		cout << "Not Exists" << endl;
	}

	int num = mp.count(3);
	cout << num << endl;
}

/*
map容器排序:
利用仿函数,可以改变排序规则
*/
class myCompare
{
public:
	bool operator()(int val1,int val2)const //这里需要加const
	{
		return val1 > val2;
	}
};

void test05()
{
	map<int, int,myCompare> mp;
	mp.insert(pair<int, int>(1, 10));
	mp.insert(pair<int, int>(2, 20));
	mp.insert(pair<int, int>(3, 30));
	mp.insert(pair<int, int>(4, 40));

	for (map<int, int,myCompare>::const_iterator it = mp.begin(); it != mp.end(); it++)
	{
		cout << "Key is: " << (*it).first << "Value is: " << (*it).second << endl;
	}

}

int main()
{
	test01();
	test02();
	test03();
	test04();
	test05();
	system("pause");
	return 0;
}

应用场景

C++的STL(标准模板库)中的map容器是一个关联容器,它提供了键值对的存储和检索功能,其中每个键都是唯一的。map基于红黑树实现,因此它在查找、插入和删除操作上具有较好的性能。以下是map容器在实际项目中的一些常见应用场景的例子:

  1. 字典/词典
    map常用于实现字典或词典的功能,其中键表示单词,值表示对应的释义、定义或其他相关信息。这在文本处理、自然语言处理等应用中很常见。

    #include <iostream>
    #include <map>
    #include <string>
    
    int main() {
        std::map<std::string, std::string> dictionary;
    
        // 添加词条
        dictionary["apple"] = "a fruit";
        dictionary["book"] = "a set of written or printed pages, usually bound with a protective cover";
        dictionary["car"] = "a four-wheeled motor vehicle used for transportation";
    
        // 查找释义
        std::cout << "Meaning of 'book': " << dictionary["book"] << std::endl;
    
        return 0;
    }
    
    
  2. 配置管理
    在项目中,map可用于存储配置信息,其中键是配置项的名称,而值是对应的配置值。这样可以方便地进行配置管理和查找。

    #include <iostream>
    #include <map>
    #include <string>
    
    int main() {
        std::map<std::string, std::string> config;
    
        // 添加配置项
        config["username"] = "john_doe";
        config["password"] = "secretpassword";
        config["server_address"] = "127.0.0.1";
    
        // 获取配置项
        std::cout << "Username: " << config["username"] << std::endl;
    
        return 0;
    }
    
    
  3. 计数器/统计
    map可以用于实现计数器,其中键是要计数的项目,而值是计数值。这在数据分析、统计学等领域中非常有用。

    #include <iostream>
    #include <map>
    #include <vector>
    
    int main() {
        std::map<int, int> counter;
        std::vector<int> data = {1, 2, 3, 2, 1, 3, 4, 5, 1, 2, 4, 4, 5};
    
        // 统计每个元素出现的次数
        for (const auto& item : data) {
            counter[item]++;
        }
    
        // 输出统计结果
        for (const auto& pair : counter) {
            std::cout << pair.first << ": " << pair.second << " times" << std::endl;
        }
    
        return 0;
    }
    
    

这些例子只是map在实际项目中应用的冰山一角,map的灵活性和高效性使得它在许多场景下都是一个强大的工具。在实际项目中,根据需要选择合适的容器是很重要的,map通常在需要快速查找、插入和删除的情况下是一个不错的选择。

实际用例

假设我们有一个简单的任务,需要统计一段文本中每个单词出现的次数。我们可以使用map容器轻松完成这个任务。以下是一个简单的C++代码示例:

#include <iostream>
#include <map>
#include <sstream>
#include <string>

int main() {
    // 输入文本
    std::string inputText = "This is a simple example. This example demonstrates the usage of map in a project.";

    // 使用istringstream分割单词
    std::istringstream iss(inputText);
    std::map<std::string, int> wordCount;

    std::string word;
    while (iss >> word) {
        // 将单词添加到map中,如果已存在则增加计数
        wordCount[word]++;
    }

    // 输出每个单词的出现次数
    std::cout << "Word frequencies:" << std::endl;
    for (const auto& pair : wordCount) {
        std::cout << pair.first << ": " << pair.second << " times" << std::endl;
    }

    return 0;
}

在这个示例中,我们使用map容器存储每个单词和其出现的次数。通过遍历文本并使用istringstream分割单词,我们可以很方便地统计每个单词的出现次数。map的优势在于它可以快速查找并更新每个单词的计数,而不需要复杂的手动管理数据结构。

这样的例子展示了在项目中使用map容器来解决实际问题时,它的简洁性和高效性。在更大规模的项目中,这种便捷的数据结构可以帮助提高代码的可读性和维护性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1503135.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

js对象 静态方法和实例方法

求下面代码的输出结果&#xff1a; 首先先分析一下上面各函数&#xff1a; Person.say function(){console.log("a")} 第一个say()方法是定义在Person函数身上的&#xff0c;我们如果想使用这个方法&#xff0c;可以通过Person().say()来调用 this.say function()…

性能测试干2年,还不会这个技术点?

nmon是一种在AIX与各种Linux操作系统上广泛使用的监控与分析工具&#xff0c;记录的信息比较全面&#xff0c;结合nmon_analyzer工具产生数据文件与图形化结果。 nmon可监控的数据类型 内存使用情况、磁盘适配器、文件系统中的可用空间、CPU使用率等等数据信息 特点 ①占用…

“删边“的并查集------反向并查集

目录 1.题目2.思路3.代码 默认大家都会并查集了 1.题目 小美认为&#xff0c;在人际交往中&#xff0c;但是随着时间的流逝&#xff0c;朋友的关系也是会慢慢变淡的&#xff0c;最终朋友关系就淡忘了。 现在初始有一些朋友关系&#xff0c;存在一些事件会导致两个人淡忘了他们…

业务代码中如何使用装饰器模式?

装饰器模式&#xff08;Decorator Pattern&#xff09;介绍 装饰器模式&#xff08;Decorator Pattern&#xff09;是一种结构型设计模式&#xff0c;我们可以动态地给一个对象添加额外的职责。而不是通过继承增加子类的方式来扩展对象的功能&#xff0c;装饰器模式使用组合的…

Android14之编译输出system/product/vendor/odm分区(一百九十一)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

【数据结构】HashMap的实现与常见问题

目录 一、概念 哈希算法与哈希表 二、哈希碰撞与解决 解决哈希冲突的四种方法 HashMap解决哈希冲突 三、代码实现 四、HashMap面试题 两个对象的hashcode一样那么equals一定一样吗&#xff1f;&& 两个对象的equals一样那么hashcode一定一样吗&#xff1f; Hash…

灵敏度都那么低了,为什么CCA的阈值还是-82

实际这个值的确是可以变化的。只是一般都不怎么变。 主要决定于两个因素。一个因素是邻区的干扰。如果干扰弱&#xff0c;那么就可以调高一点。跟布网有关。那么其实在家庭环境&#xff0c;这个不好控制。所以CCA阈值不好调整。但是如果仔细测量邻区的干扰&#xff0c;依然是可…

宝塔linux部署react项目 图文并茂 傻瓜式教学

华为云服务器购买与宝塔linux系统安装 购买服务器过程省略&#xff0c;记得付款就好&#xff0c;或者新人可去白嫖一个月试用 linux服务器安装宝塔 宝塔官网 不同版本安装命令 系统安装脚本Centos安装脚本yum install -y wget && wget -O install.sh https://downlo…

Android Studio轮播图使用失败怎么办【已解决】

Android Studio轮播图使用失败怎么办 1.在gethub上面搜索轮播图 2.选择要使用的轮播图 3.查看该轮播图的配置方法 4.复制该依赖放入build.gradle中 5.重新构建 6.使用banner 发现没有报错了 7.参考网址 https://github.com/youth5201314/banner

ELK-介绍及Elasticsearch集群搭建

ELK是三个开源软件的缩写&#xff0c;分别为Elasticsearch、Logstash、kibana它们都是开源软件。后来新增了一个FileBeat&#xff0c;它是一个轻量及的日志收集处理工具&#xff0c;因为Logstash由java程序开发&#xff0c;比较消耗内存资源&#xff0c;后来将Logstash使用go语…

解决gpt无法发送对话的问题

问题描述 如图&#xff0c;今天登上去发现怎么无法发送消息 解决 可能是cookie问题&#xff0c;重新删除了就行了 cookie删除后&#xff0c;需要重新登录&#xff0c;主题色也重置为原来的白色了

Node.js与Webpack笔记(二)

上一篇&#xff1a;Node.js与Webpack笔记&#xff08;一&#xff09;-CSDN博客 Webpack模块打包工具 1.Webpack简介以及体验 webpack是一个静态模块打包工具&#xff0c;从入口构建依赖图&#xff0c;打包有关的模块&#xff0c;最后用于展示你的内容 静态模块&#xff1a;编写…

ky10 server 银河麒麟服务器主备搭建 (nginx+keepalived)

下载脚本代码 git clone https://gitcode.net/zengliguang/nginx_keepalived_ky10_x.git 进入脚本路径 更新脚本代码 更新完成 执行安装脚本 安装nginx离线编译安装依赖 解压nginx源码 检查环境 编译 nginx安装成功 安装keepalived keepalived安装成功

华为OD机试真题-测试用例执行计划

测试用例执行计划 题目描述&#xff1a; 某个产品当前迭代周期内有N个特性({F1,F2,...,FN})需要进行覆盖测试&#xff0c;每个特性都被评估了对应的优先级&#xff0c;特性使用其ID作为下标进行标识。 设计了M个测试用例({T1,T2,...,TM})&#xff0c;每个用例对应了一个覆盖特…

【Python刷题】环形链表

问题描述 给你一个链表的头节点 head &#xff0c;判断链表中是否有环。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链表中存在环。 为了表示给定链表中的环&#xff0c;评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置&a…

SwiftUI之CoreData详解(一)

coreData 是一种数据持久化的方案&#xff0c;是对SQLite的一种封装。一说到这种桌面化的数据库&#xff0c;我就无比的怀念Foxbase|Foxpro, 多好的数据库产品&#xff0c;被微软扼杀了&#xff0c;相当年教大学生妹子们国家二级数据库时都是手把手教的&#xff0c;呃~~~&#…

解决火狐浏览器访问地址受限制问题(This address is restricted)

问题如下图&#xff1a; This address is restrictedThis address uses a network port which is normally used for purposes other than Web browsing. Firefox has canceled the request for your protection. 此地址受到限制 此地址使用通常用于 Web 浏览以外的目的的网…

21.网络游戏逆向分析与漏洞攻防-网络通信数据包分析工具-配置数据保存到文件

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 如果看不懂、不知道现在做的什么&#xff0c;那就跟着做完看效果 内容参考于&#xff1a; 易道云信息技术研究院VIP课 上一个内容&#xff1a;20.数据分析工具…

人才推荐 | 毕业于美国凯斯西储大学的博士,专业知识广泛

编辑 / 木子 审核 / 朝阳 伟骅英才 伟骅英才致力于以大数据、区块链、AI人工智能等前沿技术打造开放的人力资本生态&#xff0c;用科技解决职业领域问题&#xff0c;提升行业数字化服务水平&#xff0c;提供创新型的产业与人才一体化服务的人力资源解决方案和示范平台&#x…

前端使用Ant Design中的Modal框实现长按顶部拖动弹框需求

需求&#xff1a;需要Ant Design中的一个Modal弹框&#xff0c;并且可以让用户按住顶部实现拖动操作 实现&#xff1a;在Ant Design的Modal框的基础上&#xff0c;在title中添加一个onMouseDown去记录拖拽的坐标&#xff0c;然后将其赋值给Modal的style属性 代码部分&#xff…