当前位置:   article > 正文

【C++】STL 容器 - multimap 容器 ( multimap 容器简介 | multimap 容器常用操作 api - 插入 / 删除 / 修改 元素 )_multimap容器

multimap容器





一、multimap 容器简介



1、容器简介


multimap 容器 中 可以 存储 多个具有 相同 键 Key 的 键值对 pair 对组元素 ;

键 Key 是不是唯一的 , 多个相同的 键 排序时 先后排列在一起 ;

multimap 容器中的元素会 自动排序 , 默认情况下 , 使用 less 仿函数 排序规则 对 键 Key 进行比较排序 , 也可以自定义排序规则 ;


容器示例 : 下面的 multimap 集合中 , 存储了两个 键 是 2 的 键值对 , 分别是 (2, “Red”) 和 (2, “Cyan”) ;

    multimap<int, string> myMap;

	myMap.insert(make_pair(1, "Blue"));
	myMap.insert(make_pair(2, "Red"));
	myMap.insert(make_pair(2, "Cyan"));
  • 1
  • 2
  • 3
  • 4
  • 5

multimap 容器 与 map 容器的 主要区别是 :
multimap 容器中的 键 Key 不需要是唯一的 , 在容器中可以有多个 相同的 键 ;
也可以理解为 multimap 的 一个 键 Key 可以对应多个 值 Value ;


2、代码示例 - multimap 容器


代码示例 :

#include "iostream"
using namespace std;
#include "map"

int main() {

    multimap<int, string> myMap;

	// 插入元素
	myMap.insert(make_pair(1, "Blue"));
	myMap.insert(make_pair(2, "Red"));
	myMap.insert(make_pair(2, "Cyan"));
	myMap.insert(make_pair(4, "Green"));
	myMap.insert(make_pair(5, "Black"));

	//容器的遍历
	cout << "遍历容器 :" << endl;
	for (multimap<int, string>::iterator it = myMap.begin(); it != myMap.end(); it++)
	{
		cout << it->first << "\t" << it->second << endl;
	}
	cout << "遍历结束" << endl;


	// 控制台暂停 , 按任意键继续向后执行
	system("pause");

	return 0;
};
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29

执行结果 :

遍历容器 :
1 Blue
2 Red
2 Cyan
4 Green
5 Black
遍历结束
Press any key to continue . . .

在这里插入图片描述





二、multimap 容器常用操作 api



1、插入元素


multimap 容器插入元素 只能使用 insert 函数插入 , 不能使用 数组下标 方式 插入元素 ;

使用下面的 insert 函数插入元素 , 可以插入 键值相同 的元素 ;

// 插入单个元素,使用 pair 类型  
iterator insert(const value_type& value);  
  • 1
  • 2

代码示例 :

    multimap<int, string> myMap;

	// 插入元素
	myMap.insert(make_pair(1, "Blue"));
	myMap.insert(make_pair(2, "Red"));
	myMap.insert(make_pair(2, "Cyan"));
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

2、删除元素


调用 multimap 的 clear 函数 , 可以 删除所有的元素 ;

// 清空 multimap,删除所有元素  
void clear();
  • 1
  • 2

调用 multimap 的 erase 函数 , 可以删除指定 键值 / 指定迭代器位置 / 指定迭代器范围 的 元素 ;

  • 删除指定 键值 元素 : 通过键删除单个元素 , 返回被删除元素的数量 , 对于 multimap,可能 删除多个具有相同键的元素中的一个 ;
size_type erase(const key_type& key); 
  • 1
  • 删除 指定迭代器位置 元素 : 通过迭代器删除单个元素,返回指向下一个元素的迭代器 ;
iterator erase(const_iterator position);
  • 1
  • 删除 指定迭代器范围 元素 : 删除一个范围内的元素,返回指向下一个元素的迭代器 ;
iterator erase(const_iterator first, const_iterator last);
  • 1

3、修改元素


由于 std::multimap 关联容器 中 的 键 Key 不是唯一的 , 不能直接 通过成员函数 修改已有 键值对 元素 , 不能直接通过 键 Key 来定位并修改一个特定的元素 ;


如果想要修改 键 Key 对应的 某一个 值 Value , 只能 先找到这个 键 对应的 多个值 , 然后逐个通过 迭代器 遍历该寻找要修改的值 ;


通过 find 函数 或者 equal_range 函数 , 获取对应的迭代器 ,

  • std::multimap#find 函数 获取的是 键 的第一个 迭代器 ;
	// 修改 4 对应的值 Green 为 Purple
	auto it = myMap.find(4);
	if (it != myMap.end()) {
		// 修改找到的元素的值  
		it->second = "Purple";
	}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • std::multimap#equal_range 函数 获取的是 键 的 迭代器 区间 , 这是一个 前闭后开 区间 ;
	// 修改 2 对应的值 Cyan 为 Orange
	pair<multimap<int, string>::iterator, multimap<int, string>::iterator> range = myMap.equal_range(2);
	//auto range = myMap.equal_range(2);
	for (auto it = range.first; it != range.second; ++it) {
		// 找到 Cyan 值并修改为 Orange
		if (it->second == "Cyan") {
			it->second = "Orange";
		}
	}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

4、代码示例 - 插入 / 删除 / 修改 元素


代码示例 :

#include "iostream"
using namespace std;
#include "map"

void printMM(multimap<int, string>& myMap) {
	//容器的遍历
	cout << "遍历容器 :" << endl;
	for (multimap<int, string>::iterator it = myMap.begin(); it != myMap.end(); it++)
	{
		cout << it->first << "\t" << it->second << endl;
	}
	cout << "遍历结束" << endl;
}


int main() {

	multimap<int, string> myMap;

	// 插入元素
	myMap.insert(make_pair(1, "Blue"));
	myMap.insert(make_pair(2, "Red"));
	myMap.insert(make_pair(2, "Cyan"));
	myMap.insert(make_pair(4, "Green"));
	myMap.insert(make_pair(5, "Black"));

	// 打印 multimap
	printMM(myMap);

	// 修改 4 对应的值 Green 为 Purple
	auto it = myMap.find(4);
	if (it != myMap.end()) {
		// 修改找到的元素的值  
		it->second = "Purple";
	}

	// 修改 2 对应的值 Cyan 为 Orange
	pair<multimap<int, string>::iterator, multimap<int, string>::iterator> range = myMap.equal_range(2);
	//auto range = myMap.equal_range(2);
	for (auto it = range.first; it != range.second; ++it) {
		// 找到 Cyan 值并修改为 Orange
		if (it->second == "Cyan") {
			it->second = "Orange";
		}
	}

	// 打印 multimap
	printMM(myMap);


	// 删除 2 元素 键 的 键值对
	myMap.erase(2);

	// 打印 multimap
	printMM(myMap);

	// 清空容器
	myMap.clear();

	// 打印 multimap
	printMM(myMap);


	// 控制台暂停 , 按任意键继续向后执行
	system("pause");

	return 0;
};
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68

执行结果 :

遍历容器 :
1       Blue
2       Red
2       Cyan
4       Green
5       Black
遍历结束
遍历容器 :
1       Blue
2       Red
2       Orange
4       Purple
5       Black
遍历结束
遍历容器 :
1       Blue
4       Purple
5       Black
遍历结束
遍历容器 :
遍历结束
请按任意键继续. . .
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/672520
推荐阅读
相关标签
  

闽ICP备14008679号