std::map容器

C++ std::map排序机制详解:从键排序到按值排序的工程实践 在C++标准库中,关联容器是实现高效数据检索的重要工具,其核心原理是通过特定的数据结构维护元素的组织方式。std::map作为典型的关联容器,其底层通常基于红黑树实现,这种自平衡二叉搜索树保证了元素按键(Key)的严格弱序自动排列,从而提供了O(log n)时间复杂度的查找、插入和删除操作。这一特性使得std::map在需要按键有序访问的场景中具有重要技术价值,例如配置管理、字典序存储等。然而,在实际工程中,开发者常面临按值(Value)排序的需求,例如根据分数排名或优先级筛选。针对这一需求,标准做法是将数 阅读详情

std::map 是有序的键值对容器,map中的元素是自动按Key(键)升序排序。
它的元素的键是唯一的。可以用比较函数 Compare 自定义排序。map的内部实现通常为红黑树。

代码:

下面分别演示std::map的 增、删、改、查、迭代器使用、auto关键字使用、以及自定义排序规则。

#include <iostream>
#include <map>

using namespace std;

//自定义比较类
class MyCompare 
{
public:
	//降低理解难度,暂时不使用函数模板
	bool operator()(const int &lnum, const int &rnum) const {
		return lnum > rnum;
	}
};

typedef map<string, string> MyMap;

typedef map<int, string, MyCompare> MyCompareMap;


//重载,暂时不使用函数模板
void printf_myMap(const MyMap &map) {
	auto mapIter = map.begin();
	for (; mapIter != map.end(); mapIter++) {
		cout << mapIter->first.c_str() << "->" << mapIter->second.c_str() << endl;
	}
}

void printf_myMap(const MyCompareMap &map) {
	auto mapIter = map.begin();
	for (; mapIter != map.end(); mapIter++) {
		cout << mapIter->first << "->" << mapIter->second.c_str() << endl;
	}
}

int main()
{
	MyMap mymap;

	//插入方法1
	mymap["1"] = "稻香";
	mymap["1"] = "青花瓷";	//青花瓷替换了稻香,没有稻香了

	//插入方法2
	mymap.insert(pair<string, string>("3", "彩虹"));
	mymap.insert(pair<string, string>("4", "夜曲"));

	//插入方法3
	mymap.insert(MyMap::value_type("6", "晴天"));
	mymap.insert(MyMap::value_type("6", "蜗牛"));	//蜗牛insert不进去了,因为已经有6了

	printf_myMap(mymap);

	cout << "----------------我是分割线----------------" << endl;
	MyMap::iterator iter;
	//查找
	iter = mymap.find("6");
	if (iter != mymap.end()) {
		cout << "find is=" << iter->second.c_str() << endl;
		//删除
		iter = mymap.erase(iter);
	}
	printf_myMap(mymap);

	cout << "----------------我是分割线----------------" << endl;
	//修改
	mymap["1"] = "七里香";
	mymap["2"] = "东方破";

	printf_myMap(mymap);


	cout << "----------------自定义排序----------------" << endl;
	//这次我们按降序 来输出 map中的元素
	MyCompareMap myCompareMap;
	myCompareMap[1] = "james";
	myCompareMap[3] = "curry";
	myCompareMap[99] = "harden";
	myCompareMap[5] = "durant";

	printf_myMap(myCompareMap);

	getchar();
	return 0;
}

以上写的三种用法,虽然都可以实现数据的插入,但是它们是有区别的,
当然pair<string, string>和MyMap::value_type效果是一样的。
但是用insert函数插入数据,在数据的插入上涉及到集合的唯一性的概念,
即当map中已经有这个关键字时,insert操作是无效的,
但是用数组方式如mymap["1"] = "稻香";就不同了,它可以覆盖以前关键字对应的值。

输出:

 

三种容器 std::vector、std::map、std::unordered_set 的对比分析 选择合适的容器应根据具体需求,包括添加元素的频率、查找元素的方式和遍历容器的需求等。适用于需要频繁访问和添加元素的场景,std::map适用于需要有序存储和高效查找的场景,而则适用于需要快速查找且不关心元素顺序的场景。通过理解每种容器的特点和适用场景,可以编写更高效、更易维护的代码。 阅读详情

相关推荐

容器库(7)-std::map

std::map是一种有序关联容器,它包含具有唯一键的键值对。

Lucy_stone的博客 1331

对std::map进行排序

1、对Key排序。   std::map的第三个参数即为对key进行排序的比较函数。默认为less,表示升序。如果要降序,可以改为greater。 2、对Value排序 不支持,因为map不是一个序列的容器。如果真要排序,需要转为一个保存pair的vector,再排序。 不过这样性能就受损了,建议更换容器。 详细参考: https://blog....

dizi9750的博客 4795

C++ 各种容器的详细说明 (td::vector、std::list、std::deque、std::set、std::map 和 std::unordered_map)

是一个动态数组,能够自动调整大小。它在内存中连续存储元素,支持快速随机访问。std::list是一个双向链表,元素在内存中不连续存储。它支持高效的插入和删除操作。std::deque是一个双端队列,支持在两端高效地插入和删除元素。与不同,std::deque在内存中不连续存储元素。std::set是一个有序集合,存储唯一的元素,并自动对其进行排序。std::set通常使用红黑树实现。std::map是一个关联容器,存储键值对,并按键自动排序。std::map通常使用红黑树实现。

david_bang_1980的博客 623

自定义std::map的排序

std::map的内部排序是按照红黑树进行的,所以,查询时间复杂度为O(log2n). STL中map的定义是: 复制代码 1 template<class _Kty, 2 class _Ty, 3 class _Pr = less<_Kty>, 4 class _Alloc = allocator<pair<const _Kty, _Ty&g...

qq_28107929的博客 6955

C++STL的set/ multiset容器

3.8.1 set基本概念 简介: 所有元素都会在插入时自动被排序 本质: set/multiset属于关联式容器,底层结构是用二叉树实现。 set和multiset区别: set不允许容器中有重复的元素 multiset允许容器中有重复的元素 3.8.2 set构造和赋值 功能描述:创建set容器以及赋值 构造: set<T> st; //默认构造函数: set(const set &st); //拷贝构造函数

希望我的博客,能帮上你解决学习中工作中所遇到的问题 659

C++的数据类型----标准库类型(std::vector容器/std::list容器/std::map容器)的实例讲解

C++中标准库类型的实例讲解

weixin_41065810的博客 1602

std::map容器中的元素排序

如上述代码所示,当我们想比较map中元素进行排序的时候,并不需要考虑Element的具体类型,在写谓词函数的时候,只需要考虑key的类型即可。OK,这里不进一步讨论红黑树的实现,主要是想说一下,要对map中的元素进行排序,特别是当我们的值是自定义的时候,如何实现自定义的排序。map作为C++标准库提供的关联容器之一,内部使用的是红黑树(Red-Black Tree)作为其底层的数据结构的。假设键的类型是简单数据类型,比如int。

weixin_38213410的博客 872

深入掌握std::map容器:用法与实战

std::map是C++标准模板库(STL)中的一种关联容器,它以键值对(key-value pairs)的形式存储数据,并保持键的有序性。由于其有序的特性,std::map允许快速检索和迭代访问,使得它在处理需要频繁查找和排序的数据时非常有用。std::map在STL中的地位可以被视为一个高效且可预测的字典数据结构,常用于实现查找表和其他需要通过键值访问的场景。同时,std::map。

weixin_42591908的博客 1217

深入解析 C++ STL中的 std::map 容器

在test5()函数中,展示了如何为std::map提供自定义排序规则:cpp复制class comppublic:默认情况下,std::map会根据键值的升序进行排序。如果需要自定义排序规则,可以通过提供一个比较函数来实现。在上述代码中,comp类重载了operator(),定义了一个降序排序规则。std::map是一个功能强大的关联式容器,适用于需要快速查找、插入和删除操作的场景。通过本文的介绍,我们了解了std::map。

qq_57063846的博客 2065

【Agent】多智能体框架MetaGPT入门教程

创建一个 Action 类的子类 SimpleWriteCode,子类中定义好 prompt,并解析返回结果。在 MetaGPT 中,

酒酿小圆子呀~ 3136

android 运动目标检测_MindSpore应用案例:AI对篮球运动员目标的检测

MindSpore作为一个端边云协同的开源的全场景AI框架,今年3月份开源以来,受到了业界的广泛关注和应用,欢迎大家参与开源贡献、模型众智合作、行业创新与应用、学术合作等,贡献您在云侧、端侧 (HiMindSpore 应用程序)、边侧以及安全领域的应用案例。MindSpore与您在AI领域共同成长,让AI使能千行百业,释放出强大的生产力。本文讲述的是MindSpore对篮球运动员目标的检测应用,通...

weixin_33603813的博客 834

c++ std容器 std::map,std::vector,std::list,std::set初始化

在C++中,std::map是一个关联容器,它存储的元素是键值对(key-value pairs),其中每个键在容器中都是唯一的。你可以使用多种方法来初始化std::map<std::string, double>。以下是一些示例:默认初始化:创建一个空的std::map。使用初始化列表:在声明的同时使用初始化列表来填充std::map。使用insert成员函数:创建一个空的std::map然后使用insert成员函数来添加元素。

m0_47136986的博客 1954

实战指南:在华为防火墙上构建基于自签CA的SSL证书挑战式认证体系

本文详细介绍了在华为防火墙上构建基于自签CA的SSL证书挑战式认证体系的实战指南。通过自签CA证书生成、华为防火墙SSL VPN配置、客户端安装与测试等步骤,帮助企业实现更安全的远程办公接入方案,有效防范密码泄露风险。文章重点讲解了证书挑战登录的实现原理和配置细节,适用于企业网络安全建设。

weixin_32428571的博客 256

【C++】STL 容器 - map 关联容器 ① ( std::map 容器简介 | std::map 容器排序规则 | std::map 容器底层实现 )

一、std::map 容器 1、std::map 容器简介 2、std::map 容器排序规则 3、std::map 容器底层实现 二、代码示例 - std::map 容器 1、代码示例 2、执行结果

让 学习 成为一种 习惯 ( 韩曙亮 の 技术博客 ) 1729

linux下载NCBI基因组数据

fastq-dump --gzip --split-3 SRR25474921.sra,#使用fastq-dump将sra转换为fastq格式,--split-3 参数可以把双端测序的reads提取出来,左端标示为*_1.fastq;右端标示为*_2.fastq。安装之后转到NCBI网页搜索需要的数据或者到SRA数据中查找,我下载的是SRA数据库中的SRR25474921(SRA中是原始测序数据)prefetch --option-file SRR_Acc_List.txt #下载多个SRA文件。

k7586556的博客 2301

ROSTEA软件下载及情感分析详细操作教程(附网盘链接)

原ROST虚拟团队出品的ROST系列文本内容挖掘分析平台,是辅助人文社会科学研究的免费计算平台。该软件可以实现文本预处理、分字、分词、词性识别、特殊名词抽取、词频统计、英文词频统计、情感计算、分类算法、聚类算法等一系列文本挖掘,是人文社科研究和论文写作的一把利器。该软件用户量超过一万人,遍布海内外100多所大学,包括剑桥大学、日本北海道大学、北京大学、清华大学、香港城市大学、澳门大学等众多高校。关于ROSTCM6的安装介绍可以参考之前的文章ROSTCM6软件下载及语义网络分析详细操作教程ROST EA。

m0_64336780的博客 1万+

容器之std::map与QMap

本文对比分析了C++标准库中的std::map与Qt框架中的QMap两种关联容器。两者都基于红黑树实现,提供O(logn)的查找性能,但存在框架差异:std::map是标准C++实现,而QMap需要Qt环境。文章详细介绍了它们的使用方法,包括插入、查找和遍历操作,并指出std::map适合纯C++项目,QMap更适合Qt项目。此外,还介绍了支持重复键的std::multimap和QMultiMap的用法。开发者在选择时应根据项目框架需求决定使用哪种容器。

Lze99的博客 414

TC3XX - MCAL知识点(三十八):AURIX™ TC3xx 的EDSADC实现旋变解码功能(理论知识+手册阅读)

本文系统梳理了英飞凌AURIX系列芯片EDSADC模块的技术手册内容。首先概述了该模块的架构特点,包括模拟/数字输入通道和总线地址信息。重点解析了手册中的关键知识点:1)模拟量输入的差分/单端模式;2)数字量连接的触发、数据源和时钟源选择;3)功能配置中的寄存器操作注意事项;4)输入通道的三种数据来源模式;5)滤波器链的组成和工作原理;6)旋变应用中的载波信号生成和延迟补偿机制。最后对SRM、SAUL、SBLL等专业术语进行了详细解释。全文为理解EDSADC模块的硬件特性和配置方法提供了系统的技术参考。

梦想技术家 590

C++ STL 无序容器std::unordered_map

文章目录std::unordered_map创建 unordered_map 容器成员方法无序容器的底层实现机制成员方法获取元素的 4 种方法insert() 用法emplace() 和 emplace_hint() 方法删除元素 erase()/clear()erase()clear() std::unordered_map unordered_map 容器和 map 容器仅有一点不同,即 map 容器中存储的数据是有序的,而 unordered_map 容器中是无序的。 unordered_ma

南宫萧幕的博客 2767

基于泰勒展开改进的物理信息神经网络

基于泰勒展开改进的物理信息神经网络

天天酷科研的博客 502

Python全栈入门到实战【基础篇 05】核心基础:Python的2种运行模式(交互式+命令行式)

Python代码运行模式详解:交互式与命令行式对比 摘要: Python提供两种核心运行模式:交互式(REPL)和命令行式(脚本式)。交互式模式适合快速测试语法,即时反馈结果,通过终端输入python启动,特点是无需保存、临时执行,适合验证小段代码逻辑。命令行式模式需将代码保存为.py文件后运行,适合开发完整程序,可重复执行和修改。两种模式各有优势:交互式便于学习调试,命令行式适合实际开发。掌握两种模式的使用场景和切换方法,是Python入门的关键技能,能显著提升学习效率。

那些看似不起波澜的日复一日,会在某天让你看到坚持的意义 4553

C++ 第四阶段 STL 容器 - 第九讲:详解 std::map 与 std::unordered_map —— 关联容器的深度解析

std::map和std::unordered_map是C++标准模板库中两种重要的关联容器,均存储键值对数据。std::map基于红黑树实现,保持元素有序性,提供O(logn)的操作效率;std::unordered_map基于哈希表实现,提供O(1)的平均操作效率,但元素无序。两者在性能特性上各具优势:std::map适合需要有序访问、范围查询的场景,而std::unordered_map更适合高频查找且无需排序的场景。使用时需要注意自定义键类型陷阱、哈希冲突优化等问题,并根据具体需求合理选择容器类型。

弘羽 1103

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

C++容器:std::unordered_map, std::array, std::tuple

int age;// 相等比较运算符// 自定义哈希函数C++11引入的这些容器大大增强了标准库的能力:✅:高性能哈希表,快速查找✅std::array:类型安全的固定大小数组✅std::tuple:灵活的异构数据容器✅现代C++特性:支持auto、结构化绑定、CTAD等✅性能优势:编译期优化,运行时高效。

m0_74979597的博客 400

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

「C/C++」C++ STL容器库 之 std::map 键值对的集合容器

std::map是一个功能强大的关联容器,它提供了基于键的快速查找、插入和删除操作,同时保证元素按键排序。std::map字典或符号表:将字符串映射到整数、浮点数或其他类型的值。缓存:将键映射到缓存的值,以加快数据访问速度。配置管理:将配置选项的名称映射到其值。需要保持元素有序性的场景:如任务调度、资源管理等,其中键的自然顺序或自定义顺序很重要。通过合理使用std::map容器,可以显著提高程序的效率和可靠性,特别是在需要处理大量键值对且需要快速查找和插入操作的场景中。

何曾参静谧的博客 1330

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

关于std::Map容器的一点总结

Map容器的键值如果是C++内置数据类型,Map在构造底层的红黑树时会用到这些内置类型的但是当Map容器的键值不是内置类型而是自己定义的类型时,比如一个类、一个结构体。此时就要对Map的比较函数做一点处理,这种情况还会有两种情况出现:第一种即为如果Map的键值是类的对象是,由于类模板是静态编译的,如果自己定义的Map键值没有实现“第二种情况即为如果Map的键值是类对象的指针时,由于编译器把指针当作32位的整数来处理,此时会存在潜在的错误:不管你自己定义的类中重载了“

love_bj2008的专栏 816

Sol2容器支持详解:std::vector、map等标准容器的无缝集成

Sol2作为一款高性能的C++与Lua API封装库,其强大的容器支持功能让开发者能够轻松实现C++标准容器与Lua表之间的无缝交互。通过Sol2,你可以直接将std::vector、std::map等容器暴露给Lua脚本,享受原生级别的性能表现。😊 ## 🔥 为什么选择Sol2容器支持? Sol2的容器支持不仅仅是简单的数据传递,而是提供了**完整的双向交互能力**。C++容器在Lua中

gitblog_01064的博客 665
上一篇: std::vector容器
下一篇: c++之简单工厂模式
Qt上位机开发
Qt上位机开发 领域专家: C/C++技术领域 领域专家: C/C++技术领域
博客等级 码龄9年 9664粉丝 178原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值