C++进阶 —— map

news/2024/6/18 21:35:55 标签: c++

目录

一,map介绍

类pair

函数模板make_pair

二,map使用


一,map介绍

  • map是关联容器,按照特定的次序存储元素(由键key和值value组合而成的);
  • 键key通常用于排序及唯一标识元素,而值value则存储与键key关联的内容;
  • 键key和值value的类型可能不同,且在map的内部,key与value通过成员类型value_type绑定在一起;
typedef pair<const Key, T> value_type;
  • map中的元素总是按照其内部比较对象(compare)所指示的特定严格弱排序准则进行排序;
  • map中通过键值访问单个元素的速度通常比unordered_map容器慢,但map允许根据顺序对元素进行直接迭代;
  • map支持下标访问符,即在[ ]中放key,即可找到与key对应的value;
  • map通常被实现为二叉搜索树(更准确的说,平衡二叉搜索树(红黑树));

注:

  • map中的元素是键值对;
  • map中的key是唯一的,并且不能修改;
  • 默认按照小于的方式对key进行比较;
  • map中的元素如用迭代器去遍历,可以得到一个有序序列;
  • map底层为平衡搜索树(红黑树),查找效率比较高O(logN);

类pair

  • 此类将一对值组合在一起,值类型可以不同;
  • pair是tuple的特殊形式;
  • 可直接访问其公共成员变量firstsecond
template <class T1, class T2> struct pair;

函数模板make_pair

  • 用传递的元素,构建一个pair对象;
template <class T1, class T2>
  pair<V1,V2> make_pair (T1&& x, T2&& y);

二,map使用

  • Key,键值对中key的类型;
  • T,键值对中value的类型;
  • Compare,比较器类型,map中的元素是按照key来比较的,默认按照小于来比较,一般情况下(内置类型)该参数不需传递,如无法比较(自定义类型),需要用户自己显示传递比较规则(一般情况下按照函数指针或仿函数来传递);
  • Alloc,通过空间配置器来申请底层空间,不需要用户传递,除非用户不想使用标准库提供的空间适配器;

构造函数

操作函数

//迭代器
      iterator begin() noexcept;
const_iterator begin() const noexcept;
      iterator end() noexcept;
const_iterator end() const noexcept;
      reverse_iterator rbegin() noexcept;
const_reverse_iterator rbegin() const noexcept;
      reverse_iterator rend() noexcept;
const_reverse_iterator rend() const noexcept;

//插入
single element (1)	
    pair<iterator,bool> insert (const value_type& val);
    template <class P> pair<iterator,bool> insert (P&& val);
with hint (2)	
    iterator insert (const_iterator position, const value_type& val);
    template <class P> iterator insert (const_iterator position, P&& val);
range (3)	
    template <class InputIterator>
    void insert (InputIterator first, InputIterator last);
initializer list (4)	
    void insert (initializer_list<value_type> il);

//删除
iterator  erase (const_iterator position);
size_type erase (const key_type& k);
iterator  erase (const_iterator first, const_iterator last);

//查找
      iterator find (const key_type& k);
const_iterator find (const key_type& k) const;

//访问
mapped_type& operator[] (const key_type& k);
mapped_type& operator[] (key_type&& k);

bool empty() const noexcept;
size_type size() const noexcept;
size_type count (const key_type& k) const;
void swap (map& x);
void clear() noexcept;
key_compare key_comp() const;
value_compare value_comp() const;

      iterator lower_bound (const key_type& k);
const_iterator lower_bound (const key_type& k) const;
      iterator upper_bound (const key_type& k);
const_iterator upper_bound (const key_type& k) const;

pair<const_iterator,const_iterator> equal_range (const key_type& k) const;
            pair<iterator,iterator> equal_range (const key_type& k);
int main()
{
	map<string, string> m;
	
	m.insert(pair<string, string>("peach", "桃子")); //pair<string, string> p("peach", "桃子");
	m.insert(make_pair("banan", "香蕉"));
	m["apple"] = "苹果";
	//m.at("waterme"); //不存在抛异常
	cout << m.size() << endl;
	cout << m.count("waterme") << endl;

	pair<map<string, string>::iterator, bool> ret = m.insert(make_pair("banan", "香蕉"));
	if (ret.second)
		cout << "insert successful" << endl;
	else
		cout << "insert failed" << endl;

	for (auto& e : m)
	{
		cout << e.first << "-->" << e.second << endl;
	}

	m.erase("apple");

	map<string, string>::iterator it = m.begin();
	while (it != m.end())
	{
		cout << (*it).first << "-->" << (*it).second << endl;
		++it;
	}

	it = m.find("banan");
	cout << (*it).first << "-->" << (*it).second << endl;
	return 0;
}


http://www.niftyadmin.cn/n/375929.html

相关文章

uni-app实现 app 小程序 手机端H5扫码功能

首先 扫码这个功能小程序和App都是有现成的方法 但是H5是不行的 我们可以看这样一段代码 <template><view><!-- #ifdef MP-WEIXIN --><button click"scan">扫描</button><view v-if"result">{{result}}</view>…

LangChain 查询使用指「北」

一只鹦鹉加上一根链条&#xff0c;组成了时下最流行的 AI 话题热门榜选手——LangChain。 LangChain 是一种 AI 代理工具&#xff0c;可以为以 ChatGPT 为代表的额大语言模型&#xff08;LLM&#xff09;增添更多功能。此外&#xff0c;LangChain 还具备 token 和上下文管理功能…

Softing“物联网连接和OPC UA通信”系列研讨会

— 免费线上研讨会概览 — 您是否正在为车间应用寻找机器连接&#xff1f;您是否需要为创新的物联网解决方案制定架构决策&#xff1f;或者您是否已经选择了物联网平台&#xff0c;需要连接组件来访问自动化网络中的数据&#xff1f;在Softing线上研讨会中&#xff0c;我们将讨…

如何通过自学成为一名白帽黑客(网安工程师)

从事网络安全这么多年&#xff0c;总是会被问到很多奇奇怪怪的问题&#xff1a; 「叔叔&#xff0c;我Steam账号被盗了&#xff0c;能帮忙找回吗&#xff1f;我给你发红包」 「我的手机被监控了&#xff0c;生活和工作受到了严重影响&#xff0c;该怎么解决&#xff1f;」 「…

C4d渲染农场的定义、应用领域和未来发展趋势

Cinema 4D&#xff08;C4D&#xff09;是一款常用于3D动画、建模和渲染的软件&#xff0c;由Maxon Computer开发。随着CG行业的不断发展和应用场景的多样化&#xff0c;C4D渲染农场成为了CG制作中不可或缺的一环。本文将深入介绍C4D渲染农场的概念、特点、应用以及未来发展趋势…

ARM-伪操作

目录 协处理器指令 伪操作 安装交叉编译工具 Makefile 进入命令&#xff1a;vi ASM-ARM.s 宏定义 make之后查看ASM-ARM.dis反汇编文件 预编译指令 申请一个字的空间 .word 申请多个字节空间 嵌套编程 方式一&#xff1a;汇编跳转到C 方式二&#xff1a;C跳转到汇编 方式三&…

ARM实验5-流水灯仿真实验

一、实验名称&#xff1a;流水灯仿真实验 二、实验目的&#xff1a; 掌握ARM处理器的输入输出接口。掌握通过MDK提供的仿真功能&#xff0c;实现系统的仿真运行。通过该编程实验&#xff0c;进一步巩固和强化学生ARM汇编编程的能&#xff0c;ARM应用程序框架&#xff0c;培养…

github SSH 生成和使用(详细)

通过ssh连接github&#xff0c;可以有效的提升安全性 1.设置位置 2.生成ssh密钥&#xff08;windows&#xff09; 打开git bash&#xff0c;输入以下命名&#xff0c;把your_emailexample.com换成自己的github账号 ssh-keygen -t rsa -b 4096 -C "your_emailexample.co…