map容器

map,在编程中称之为映射,是一种键(key)与值(value)的对应关系

例如:数组的下标到值的映射

map 翻译为映射,是STL中常用的容器。map可以将任何有序的类型(包括基本类型和string)映射到任何类型(包括基本类型、string、结构体和STL容器)。

使用 map 需要添加头文件

#include<map>

定义的格式:map<键类型,值类型> 映射名;

例如:

map<string,int> mp;
map<long long, long long> mp;

map 的初始化

//创建map
map<int, int> mp1;
//创建并初始化
map<string, int> mp2{{"abc", 1}, {"xyz", 2}, {"ijk", 3}};
//map的拷贝
map<string, int> mp3(mp2);

map 在使用的时候一定要注意:

  1. 自动排序:map中的元素是根据键自动排序的。比如整数或字符串,它们将按照升序排列。
  2. 唯一键:每个键都必须是唯一的。如果你尝试插入一个已经存在的键,插入操作将不会成功,但可以更新该键对应的值。
  3. 操作复杂度:map的基本操作(如查找、插入和删除)通常时间复杂度为(O(log n))。
  4. 引用返回:当你访问map中的元素时,如m[key],如果键不存在,map会自动创建一个新元素并插入到map中,int型默认为0,string为空串。
  5. 关联数组:map可以被看作是一个关联数组,你可以通过键来访问值,就像使用数组索引一样。

map 的优势

  1. 动态存储空间
  2. 插入、删除、查找的效率高
  3. 键与值的类型定义非常灵活

常用的场景

  1. 判断范围较大的整数(例如在桶排序中)或者其他类型数据(例如string)是否存在
  2. 需要建立字符(字符串)与整数之间的映射
  3. 字符串与字符串之间的映射

迭代器

迭代器的作用与指针类似,可通过引用操作(*)访问其所指向的元素内容。常用的容器(例如map,set,vector等)都可以使用一对迭代器来表示范围,即begin(指向该容器第一个元素)和end(指向该容器最后一个元素之后的位置)。

map 中迭代器的定义:

map<long long, long long>::iterator it;

基于迭代器遍历 map 容器

#include <iostream>
#include <map>
using namespace std;
map<long long, long long> mp;
int main()
{
	mp.insert({{9e18, 8e15}, {1, 1}, {2, 2}}); 
	map<long long, long long>::iterator it;
	for(it = mp.begin(); it != mp.end(); it++){
	    cout << it->first << " " << it->second << endl;
	}
	return 0;
}

基于范围的 for 循环-能遍历所有STL容器

之前的学习过程中,如果想要遍历数组,需要使用for(int i = 1; i <= n; i++),而C++11标准为C++添加了一种新的for循环方式 – 基于范围(range-base)的for循环,这样在遍历数组元素时会更方便这种基于范围的for循环适用于各种类型的数组,还适用于各种STL容器比如map、list、vector等

int a[10] = {1,2,3,4,5};
for (int i : a)
{
	cout << i << " ";
}

string s = "hello";
for (char c : s)
{
	cout << c << " ";
}

注意:变量 i 逐一获得容器a元素的拷贝但无法改变容器的元素

auto

在C语言和C++11之前的C++语言中auto用于显式地指出变量为自动存储,由于只能将auto用于默认为自动的变量,很少有人用在C++11制定时,制定标准的人不愿引入新关键字,因为这样可能导致将该关键字用于其他目的的代码非法,考虑到auto的老用法很少使用,所以赋予了新含义在C++11当中,auto让编译器能根据初始值的类型推断变量的类型

结合基于范围的for循环就可以写成

for (auto it : a)
{
      cout << it << " "; 
}

定义:在C++11当中,auto让编译器能根据初始值的类型推断变量的类型

需要注意:

  1. 用auto声明的变量必须初始化。
  2. 函数形参不能被声明为auto
  3. auto只是占位符,不是实际的数据类型,因此不能用于类型转换或其他一些操作,如sizeof。
  4. 定义在一个auto序列的变量必须始终推导成同一类型。

需要注意使用auto范围遍历map容器时,it是一个解引用后的键值对对象,直接使用it.first和it.second即可,不可以使用it->first和it->second

map容器-码途星探

map 基本操作操作

方法功能
mp[key] = value;创建key且赋值为value
mp.emplace(key,value)插入键值对key->value
mp.insert({{key1, value1}, {key2, value2}})插入键值对key1->value1和key2->value2
mp.size()返回map中键值对的个数
mp.erase(key)根据键删除键值对
mp.begin()返回指向map头部的迭代器
mp.end()返回指向map末尾的迭代器
it->first返回当前迭代器指向的键值对中的键
it->second返回当前迭代器指向的键值对中的值
mp.clear()删除所有元素
mp.empty()判断是否为空
mp.find(key)获得指向元素的迭代器,如果未找到返回mp.end()
swap(mp1, mp2)交换两个map中的值
© 版权声明
THE END
喜欢就支持一下吧
点赞14 分享
评论 共2条

请登录后发表评论