C++中不得不说的map容器

目录
  • 前言
  • 1,map基本概念
  • 2,map构造和赋值
  • 3,大小和交换
  • 4,插入和删除
  • 5,查找和统计
  • 6,排序
  • 总结

前言

为什么这两天在研究C++的容器呢,因为刷题的时候碰见了几个不擅长的题,得用STL中的几种容器才能解出来,所以也是动力满满呀,希望能尽快转过头去把那几个题给写出来,哈哈哈,当然,解题思路和过程后续我也会分享出来。话不多说,老规矩,

使用map容器要包含头文件#include<map>

1,map基本概念

简介:

map中所有元素都是pair(成对出现的数)

pair中第一个元素为key(键值),起到索引的作用,第二个元素为value(实值)

所有的元素都会根据元素的键值自动排序

本质:

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

优点

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

map和multimap的区别:

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

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

2,map构造和赋值

功能描述:

对map容器进行构造和赋值操作

代码实现:

#include<iostream>
#include<map>
using namespace std;
void printMap(map<int, int>& m)
{
	for (map<int, int>::iterator it = m.begin(); it != m.end(); it++) {
		cout << "key=" << (*it).first << " value=" << (*it).second << endl;
	}
	cout << endl;
}
void test01()
{
	//创建map容器 1,默认构造
	map<int, int>m;  //要写两个数据类型
	m.insert(pair<int, int>(1, 10));
	m.insert(pair<int, int>(3, 30));  //与插入的顺序无关
	m.insert(pair<int, int>(2, 20));  //容器会根据key值进行自动排序
	m.insert(pair<int, int>(4, 40));
	printMap(m);

	//2,拷贝构造
	map<int, int>m2(m);
	printMap(m2);

	//3,赋值
	map<int, int>m3;
	m3 = m2;  //等号方式赋值
	printMap(m3);
}
int main() {
	test01();
	return 0;
}

3,大小和交换

功能描述:

统计map容器大小以及交换map容器

函数原型:

size(); //返回容器中元素的个数

empty(); //bool类型,判断容器是否为空

swap(st); //交换两个集合容器

4,插入和删除

功能描述:

map容器进行插入和删除数据

代码实现:

#include<iostream>
#include<map>
using namespace std;
void test01()
{
	map<int, int>m;
	//第一种插入
	m.insert(pair<int, int>(1, 10));

	//第二种插入
	m.insert(make_pair(2, 20)); //不用写模板参数

	//第三种插入
	m.insert(map<int, int>::value_type(3, 30));

	//第四种插入
	m[4] = 40;

	//第一种删除
	m.erase(m.begin()); //参数为迭代器

	//第二种删除
	m.erase(1); //按照key删除

	//第三种删除
	m.erase(m.begin(), m.end()); //区间删除

	//第四种删除
	m.clear(); //全部删除
}
int main() {
	test01();
	return 0;
}

5,查找和统计

功能描述:

对map容器进行查找数据以及统计数据

函数原型:

find(key);

/*查找key是否存在,若存在,返回该元素的迭代器;

若不存在,返回end()迭代器*/

count(key);     // 统计key的元素个数

/*map不允许插入重复key值,count统计结果要么是0,要么是1

multimap的count统计结果可能大于1*/

6,排序

map容器默认的排序方式是,按照key值进行从小到大的排序,但是我们可以利用仿函数实现从大到小排序,话不多说,直接上代码

#include<iostream>
#include<map>
using namespace std;
class MyCompare
{
public:
	bool operator()(int v1,int v2)const
	{
		return v1 > v2;  //降序
	}
};
void test01()
{
	map<int, int, MyCompare>m;  //加入仿函数
	m.insert(make_pair(1, 10));
	m.insert(make_pair(2, 20));
	m.insert(make_pair(3, 30));
	m.insert(make_pair(4, 40));
	for (map<int, int,MyCompare>::iterator it = m.begin(); it != m.end(); it++) {//输出的时候别忘了加上
		cout << "key=" << it->first << " value=" << it-> second << endl;
	}
}
int main() {
	test01();
	return 0;
}

另外,对于自定义数据类型,map必须要指定排序规则。

总结

到此这篇关于C++中不得不说的map容器的文章就介绍到这了,更多相关C++ map容器内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • C++ map详解

    目录 一:赋值 1.直接赋值 2.使用insert 3.初始化列表.列表初始化适用于c++11和以上版本. 4.插入一个key但不指定value 总结 一:赋值 1.直接赋值 map<string, int> m1; m1["def"] = 2; 2.使用insert map<string, int> m2; m2.insert({ "abc", 1 }); //使用这种就可以了 //其他形式和方式 m2.insert(make_pair(s

  • C++ map的简单使用实现

    map和set的底层都是通过红黑树来实现的,但并不是原生态的红黑树,而是经过改造后的红黑树.且容器都会在各自的类中添加一些独特的函数来解决各自适配的问题 map和set底层是改造后的红黑树,我们先来看看改造后的红黑树 和普通的红黑树不同的是,在根节点上再加了一个头结点,该结点不是真实的结点,只是一个辅助结点,是为了后面实现红黑树的迭代器而出现的.该header结点的父节点就是真实的根节点,其左孩子是这棵树的最左结点,其右孩子是这棵树的最右节点. 我们现在通过STL源码来简单剖析一下map和set

  • C++ map用法总结(整理)

    1,map简介 map是STL的一个关联容器,它提供一对一的hash. 第一个可以称为关键字(key),每个关键字只能在map中出现一次:第二个可能称为该关键字的值(value): map以模板(泛型)方式实现,可以存储任意类型的数据,包括使用者自定义的数据类型.Map主要用于资料一对一映射(one-to-one)的情況,map內部的实现自建一颗红黑树,这颗树具有对数据自动排序的功能.在map内部所有的数据都是有序的,后边我们会见识到有序的好处.比如一个班级中,每个学生的学号跟他的姓名就存在著一

  • c++ 数据结构map的使用详解

    map的常用用法 map 表示映射,可以将任何基本类型(包括 STL 容器)映射到任何基本类型(包括 STL 容器),例如可以建立如 int 到 double,string 到 int 的映射等. map 提供一对一的 hash,该功能类似 Python 的字典: 第一个称为键( key ),每个关键字只能在 map 中出现一次: 第二个称为该键的值( value ): 1. 头文件 <bits/stdc++.h> 头文件已经包括了该头文件. 2. 定义 定义 map 如下,参数的第一个为 k

  • C++中不得不说的map容器

    目录 前言 1,map基本概念 2,map构造和赋值 3,大小和交换 4,插入和删除 5,查找和统计 6,排序 总结 前言 为什么这两天在研究C++的容器呢,因为刷题的时候碰见了几个不擅长的题,得用STL中的几种容器才能解出来,所以也是动力满满呀,希望能尽快转过头去把那几个题给写出来,哈哈哈,当然,解题思路和过程后续我也会分享出来.话不多说,老规矩, 使用map容器要包含头文件#include<map> 1,map基本概念 简介: map中所有元素都是pair(成对出现的数) pair中第一个

  • JavaScript实现Java中Map容器的方法

    本文实例讲述了JavaScript实现Java中Map容器的方法.分享给大家供大家参考,具体如下: 声明一下,JavaScript和Java的区别就像雷锋和雷峰塔的区别. 在Java中,Map是一种集合,用来存储Key-Value键值对的容器.根据键得到值,因此不允许键重复(重复了的覆盖),但允许值重复.JavaScript中的对象特性,就是不允许有相同的属性存在,和Java的Map非常的相似,所以可以利用这个特性在JavaScript中来实现Map容器,实现基本的增删查的操作. functio

  • Java中具有映射关系的容器:数组和Map的区别说明

    映射就意味着有两部分: 存储映射关系的容器是数组和Map集合: 区别: (1)当映射关系中的一方是有序编号时,这个时候要想到数组这种结构: (2)Map不一定需要有序编号,它只能建立对象之间的关系: (3)如果映射的两方没有任何一方是有序的编号,就不能想数组了,这时应该用集合中具备映射关系的容器Map. 注意: (1)Map中键相同时,键值会被覆盖: (2)Map中一个Key可以对应一个集合,因为集合也是一个对象,集合也能往集合中放. (3)Map<int,char>这样写是不正确的,因为,泛

  • C++深入分析STL中map容器的使用

    目录 1.map容器 2.map容器原理 3.map容器函数接口 4.使用示例 1.map容器 map是C++ STL的一个关联容器,它提供一对一的数据处理能力.其中,各个键值对的键和值可以是任意数据类型,包括 C++ 基本数据类型(int.double 等).使用结构体或类自定义的类型. 第一个可以称为关键字(key): 第二个可能称为该关键字的值(value): 该容器存储的都是 pair<const K, T> 类型(其中 K 和 T 分别表示键和值的数据类型)的键值对元素. 使用 ma

  • Java中List Set和Map之间的区别_动力节点Java学院整理

    Java集合的主要分为三种类型: • Set(集) • List(列表) • Map(映射) 要深入理解集合首先要了解下我们熟悉的数组: 数组是大小固定的,并且同一个数组只能存放类型一样的数据(基本类型/引用类型),而JAVA集合可以存储和操作数目不固定的一组数据. 所有的JAVA集合都位于 java.util包中! JAVA集合只能存放引用类型的的数据,不能存放基本数据类型. 世间上本来没有集合,(只有数组参考C语言)但有人想要,所以有了集合 有人想有可以自动扩展的数组,所以有了List 有的

  • C++如何删除map容器中指定值的元素详解

    前言 大家都知道map容器是C++ STL中的重要一员,平时会遇到删除map容器中value为指定元素的问题,例如删除所有字符串为"123"或者能整除3的元素. 一.map容器下的方法说明 由于map容器下的方法较多,这里只列举代码中用到的几个方法: insert()方法: //插入val到pos的后面,然后返回一个指向这个元素的迭代器 iterator insert( iterator pos, const pair<KEY_TYPE,VALUE_TYPE> &v

  • Java通过工厂、Map容器创建对象的方法

    一.通过工厂+反射+配置文件创建对象 通过工厂+反射+配置文件获取对象 /** * @Author: Promsing * @Date: 2021/3/7 - 10:09 * @Description: 通过使用工厂+配置文件+反射实现创建对象 * @version: 1.0 */ public class AbsFactory { //声明一个变量(多例模式,每次通过工厂都会创建一个不同的实例) private static Object obj; public static Object c

  • Java中List  Set和Map之间的区别_动力节点Java学院整理

    Java集合的主要分为三种类型: • Set(集) • List(列表) • Map(映射) 要深入理解集合首先要了解下我们熟悉的数组: 数组是大小固定的,并且同一个数组只能存放类型一样的数据(基本类型/引用类型),而JAVA集合可以存储和操作数目不固定的一组数据. 所有的JAVA集合都位于 java.util包中! JAVA集合只能存放引用类型的的数据,不能存放基本数据类型. 世间上本来没有集合,(只有数组参考C语言)但有人想要,所以有了集合 有人想有可以自动扩展的数组,所以有了List 有的

  • Erlang中的映射组Map详细介绍

    主要是遇到 Map匹配的问题,所以顺便回忆一下 Erlang 中的映射组 Map,在其它语言中被称作 Hash 哈希或者 Dict 字典. Erlang 从 R17 版本开始支持映射组 创建映射组 Erlang 中的映射组用结构 #{} 表示,创建一个映射组可以这样 复制代码 代码如下: % 不管你怎么排序,最终结果都是按键的字典顺序排列的 #{ name => "wittyfox", age => 19 }. % => #{age => 20,name =&g

  • C++中vector可以作为map的键值实例代码

    因为项目中需要根据状态找到一个对应的结果,就采用了map的结构,但是状态本身较为复杂,存在一个vector中.上次使用map的经验是自定义类类型作为键值必须重载<操作符,因为map的快速查找是基于红黑树的构建,因而键值必须能相互之间比较.所以担心vector作为类类型的键值会引发一些错误,就写了一个例子测试.结果证明vector可以直接作为map的键值使用. #include<iostream> #include<string> #include<vector>

随机推荐