STL——map

devtools/2025/1/16 15:59:24/

 目录

map类

 map的构造

 map的增删查

 map的数据修改


map类

 Key就是map底层关键字的类型,T是map底层value的类型,set默认要求Key⽀持

⼩于⽐较,如果不⽀持或者需要的话可以⾃⾏实现仿函数传给第⼆个模版参数,map底层存储数据的内存是从空间配置器申请的。⼀般情况下,我们都不需要传后两个模版参数。map底层是⽤红⿊树实现,增删查改效率是 O ( logN ) ,迭代器遍历是⾛的中序,所以是按key有序顺序遍历的

 map的构造

// empty (1) ⽆参默认构造
explicit map (const key_compare& comp = key_compare(),
const allocator_type& alloc = allocator_type());// range (2) 迭代器区间构造
template <class InputIterator>
map (InputIterator first, InputIterator last,
const key_compare& comp = key_compare(),
const allocator_type& = allocator_type());// copy (3) 拷⻉构造
map (const map& x);// initializer list (5) initializer 列表构造
map (initializer_list<value_type> il,
const key_compare& comp = key_compare(),
const allocator_type& alloc = allocator_type());// 迭代器是⼀个双向迭代器
iterator -> a bidirectional iterator to const value_type// 正向迭代器
iterator begin();
iterator end();
// 反向迭代器
reverse_iterator rbegin();
reverse_iterator rend();

 map的增删查

// 单个数据插⼊,如果已经key存在则插⼊失败,key存在相等value不相等也会插⼊失败
pair<iterator,bool> insert (const value_type& val);// 列表插⼊,已经在容器中存在的值不会插⼊
void insert (initializer_list<value_type> il);// 迭代器区间插⼊,已经在容器中存在的值不会插⼊
template <class InputIterator>
void insert (InputIterator first, InputIterator last);// 查找k,返回k所在的迭代器,没有找到返回end()
iterator find (const key_type& k);// 查找k,返回k的个数
size_type count (const key_type& k) const;// 删除⼀个迭代器位置的值
iterator erase (const_iterator position);// 删除k,k存在返回0,存在返回1
size_type erase (const key_type& k);// 删除⼀段迭代器区间的值
iterator erase (const_iterator first, const_iterator last);// 返回⼤于等k位置的迭代器
iterator lower_bound (const key_type& k);
// 返回⼤于k位置的迭代器
const_iterator lower_bound (const key_type& k) const;

 map的数据修改

 map⽀持修改mapped_type 数据,不⽀持修改key数据,修改关键字数据,破坏了底层搜

索树的结构。
map第⼀个⽀持修改的⽅式时通过迭代器,迭代器遍历时或者find返回key所在的iterator修改,map还有⼀个⾮常重要的修改接⼝operator[],但是operator[]不仅仅⽀持修改,还⽀持插⼊数据和查找数 据,所以他是⼀个多功能复合接⼝

/ 1、如果key已经在map中,插⼊失败,则返回⼀个pair<iterator,bool>对象,返回pair对象

first key 所在结点的迭代器, second false
// 2 、如果 key 不在在 map 中,插⼊成功,则返回⼀个 pair<iterator,bool> 对象,返回 pair 对象
first 是新插⼊ key 所在结点的迭代器, second true
// 也就是说⽆论插⼊成功还是失败,返回 pair<iterator,bool> 对象的 first 都会指向 key 所在的迭
代器
// 那么也就意味着 insert 插⼊失败时充当了查找的功能,正是因为这⼀点, insert 可以⽤来实现
operator[]
// 需要注意的是这⾥有两个 pair ,不要混淆了,⼀个是 map 底层红⿊树节点中存的 pair<key, T> ,另
⼀个是 insert 返回值 pair<iterator,bool>
mapped_type& operator[] (const key_type& k)
{
// 1、如果k不在map中,insert会插⼊k和mapped_type默认值,同时[]返回结点中存储mapped_type值的引⽤,那么我们可以通过引⽤修改返映射值。所以[]具备了插⼊+修改功能
// 2、如果k在map中,insert会插⼊失败,但是insert返回pair对象的first是指向key结点的迭代器,返回值同时[]返回结点中存储mapped_type值的引⽤,所以[]具备了查找+修改的功能pair<iterator, bool> ret = insert({ k, mapped_type() });iterator it = ret.first;return it->second;
}
#include<map>
#include<iostream>
#include<string>using namespace std;int main()
{map<string, string> dict = { {"left", "左边"}, {"right", "右边"},{"insert", "插入"},{ "string", "字符串" } };auto it = dict.begin();while (it != dict.end()){cout << it->first << " " << it->second << endl;++it;}cout << endl;pair<string, string> kv1("first", "第一个");dict.insert(kv1);dict.insert(pair<string, string>("second", "第二个"));dict.insert(make_pair("sort", "排序"));dict.insert({ "auot", "自动的" });for (const auto& e : dict)cout << e.first << ":" << e.second << endl;cout << endl;// 结构化绑定 C++17for (const auto& [k, v] : dict)cout << k << ":" << v << endl;string str;while (cin >> str){auto ret = dict.find(str);if (ret != dict.end())cout << "->" << ret->second << endl;elsecout << "无此单词,请重新输入" << endl;}string arr[] = { "苹果", "西瓜", "苹果", "西瓜", "苹果", "苹果", "西瓜",
"苹果", "香蕉", "苹果", "香蕉" };map<string, int> m;for (const auto& str : arr){/*auto ret = m.find(str);if (ret != m.end()){ret->second++;}else{m.insert({ str, 1 });}*/m[str]++;}for (const auto& e : m)cout << e.first << ":" << e.second << endl;cout << endl;return 0;
}


http://www.ppmy.cn/devtools/150989.html

相关文章

Ubuntu 系统支持高刷显示:探索与实践

Ubuntu 系统支持高刷显示&#xff1a;探索与实践 引言 随着技术的发展&#xff0c;显示器的刷新率从传统的60Hz逐渐提升到了120Hz、144Hz甚至更高。高刷新率屏幕能够提供更加流畅的视觉体验&#xff0c;尤其在游戏和动画播放中显得尤为重要。对于使用Ubuntu操作系统的用户来说…

pytorch张量分块投影示例代码

张量的投影操作 背景 张量投影 是深度学习中常见的操作,将输入张量通过线性变换映射到另一个空间。例如: Y=W⋅X+b 其中: X: 输入张量(形状可能为 (B,M,K),即批量维度、序列维度、特征维度)。W: 权重矩阵((K,N),将 K 维投影到 N 维)。b: 偏置向量(可选,(N,))。Y:…

硬件实用技巧:TPS54331DR横杠标识识别1引脚

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/145116969 长沙红胖子Qt&#xff08;长沙创微智科&#xff09;博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV…

Zookeeper(1)什么是Zookeeper?

Zookeeper 是一个分布式协调服务&#xff0c;主要用于分布式应用中的协调工作。它提供了分布式应用所需的一些基础服务&#xff0c;如配置管理、命名服务、分布式同步、组服务等。Zookeeper 通过其简单且高效的原语&#xff08;如节点、会话、观察者等&#xff09;实现了这些功…

G1原理—G1的GC日志分析解读

1.TLAB的GC日志解读 (1)一套基本的参数设置 首先参数上要有一套基本的设置&#xff1a; -XX:InitialHeapSize128M -XX:MaxHeapSize128M -XX:UseG1GC -XX:PrintGCDetails -XX:PrintGCTimeStamps -XX:PrintTLAB -XX:UnlockExperimentalVMOptions -XX:G1LogLevelfinest -XX:MaxGCP…

GaussDB分布式数据倾斜处理

常规数据倾斜巡检 在库中表个数少于1W的场景&#xff0c;直接使用倾斜视图查询当前库内所有表的数据倾斜情况 SELECT * FROM pgxc_get_table_skewness ORDER BY totalsize DESC;在库中表个数非常多&#xff08;至少大于1W&#xff09;的场景&#xff0c;因PGXC_GET_TABLE_SKEWN…

[Qt] 窗口 | 菜单栏MenuBar

目录 QMainWindow 概述 一、菜单栏 1、创建菜单栏 2、在菜单栏中添加菜单 3、创建菜单项 4、在菜单项之间添加分割线 5、添加快捷键 6、添加子菜单 7、添加图标 综合示例 QMainWindow 概述 Qt 窗口是通过 QMainWindow 类来实现的。 QMainWindow 是一个为用户 提供主…

Ubuntu 的内置字体中哪些字体支持中文

Ubuntu 的内置字体中&#xff0c;部分字体是支持中文的&#xff0c;但默认配置可能不完整或显示效果不佳。以下是 Ubuntu 内置支持中文的字体以及如何增强对中文的支持&#xff1a; Ubuntu 内置支持中文的字体 Noto Fonts&#xff08;推荐&#xff09; 字体名称&#xff1a;Not…