C++提高编程---3.9 STL-常用容器-map/multimap 容器【P231~P235】

C++提高编程---3.9 STL-常用容器-map/multimap 容器【P231~P235】

    • [3.9 map/multimap 容器](#3.9 map/multimap 容器)
      • [3.9.1 map 容器基本概念](#3.9.1 map 容器基本概念)
      • [3.9.2 map 构造和赋值](#3.9.2 map 构造和赋值)
      • [3.9.3 map 大小和交换](#3.9.3 map 大小和交换)
      • [3.9.4 map 插入和删除](#3.9.4 map 插入和删除)
      • [3.9.5 map 查找和统计](#3.9.5 map 查找和统计)
      • [3.9.6 map 容器排序](#3.9.6 map 容器排序)

3.9 map/multimap 容器

3.9.1 map 容器基本概念

简介:

  • map中所有元素都是pair
  • pair中第一个元素为 key(键值),起到索引作用,第二个元素为value(实值)
  • 所有元素都会根据元素的键值自动排序

本质:

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

优点:

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

map和multimap区别:

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

3.9.2 map 构造和赋值

cpp 复制代码
#include<iostream>
#include<map>
using namespace std;

void printMap(const map<int, int>&m) 
{
	for (map<int, int>::const_iterator it = m.begin(); it != m.end(); it++) {
		cout << "key = " << (*it).first << " value = " << it->second << endl;
	}
	cout << endl;
}

void test01() {
	map<int, int>m;
	// 默认构造
	m.insert(pair<int, int>(1, 10));
	m.insert(pair<int, int>(2, 20));
	m.insert(pair<int, int>(3, 30));
	m.insert(pair<int, int>(4, 40));
	m.insert(pair<int, int>(5, 50));

	printMap(m);

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

	// 赋值
	map<int, int>m3;
	m3 = m;
	printMap(m3);

}



int main() {
	test01();

	system("pause");
	return 0;
}

总结:map中所有元素都是成对出现,插入数据时候要使用对组

3.9.3 map 大小和交换

基本和 set 容器一样

cpp 复制代码
#include<iostream>
#include<map>
using namespace std;

void printMap(const map<int, int>&m)
{
	for (map<int, int>::const_iterator it = m.begin(); it != m.end(); it++) {
		cout << "key = " << (*it).first << " value = " << it->second << endl;
	}
	cout << endl;
}

void test01() {
	map<int, int>m;
	// 默认构造
	m.insert(pair<int, int>(1, 10));
	m.insert(pair<int, int>(2, 20));
	m.insert(pair<int, int>(3, 30));
	m.insert(pair<int, int>(4, 40));
	m.insert(pair<int, int>(5, 50));

	cout << "交换前" << endl;
	printMap(m);

	if (m.empty())
		cout << "m 为空" << endl;
	else {
		cout << "m 不为空" << endl;
		cout << "m 的大小为:" << m.size() << endl;
	}

	map<int, int>m2;
	// 默认构造
	m2.insert(pair<int, int>(100, 10));
	m2.insert(pair<int, int>(200, 20));
	m2.insert(pair<int, int>(300, 30));
	m2.insert(pair<int, int>(400, 40));
	m2.insert(pair<int, int>(500, 50));
	printMap(m2);

	m.swap(m2);
	cout << endl << "交换后" << endl;
	printMap(m);
	printMap(m2);

}



int main() {
	test01();

	system("pause");
	return 0;
}

3.9.4 map 插入和删除

cpp 复制代码
#include<iostream>
#include<map>
using namespace std;

void printMap(const map<int, int>&m)
{
	for (map<int, int>::const_iterator it = m.begin(); it != m.end(); it++) {
		cout << "key = " << (*it).first << " value = " << it->second << endl;
	}
	cout << endl;
}

void test01() {
	map<int, int>m;
	// 第一种插入
	m.insert(pair<int, int>(1, 10));
	m.insert(pair<int, int>(2, 20));

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

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

	// 第四种,不建议插入,但是可以用来访问
	m[4] = 40;
	printMap(m);

	cout << m[5] << endl;			// m[5] 不存在,会创建一个 value = 0 的数出来
	printMap(m);

	//// 删除
	m.erase(m.begin());
	printMap(m);

	m.erase(5);			// 按照 key 值删除
	printMap(m);

	//m.erase(m.begin(), m.end());
	m.clear();
	printMap(m);
}



int main() {
	test01();

	system("pause");
	return 0;
}

3.9.5 map 查找和统计

cpp 复制代码
#include<iostream>
#include<map>
using namespace std;

void printMap(const map<int, int>&m)
{
	for (map<int, int>::const_iterator it = m.begin(); it != m.end(); it++) {
		cout << "key = " << (*it).first << " value = " << it->second << endl;
	}
	cout << endl;
}

void test01() {
	map<int, int>m;
	// 第一种插入
	m.insert(pair<int, int>(1, 10));
	m.insert(pair<int, int>(2, 20));
	m.insert(pair<int, int>(3, 30));

	map<int, int>::iterator pos = m.find(3);

	if (pos != m.end())
	{
		cout << "查到了元素 key = " << pos->first << "  value 值为:" << pos->second << endl;
	}
	else {
		cout << "未找到元素" << endl;
	}

	int count = m.count(3);
	cout << "key 为 3 的元素有" << count << "个" << endl;
}



int main() {
	test01();

	system("pause");
	return 0;
}

3.9.6 map 容器排序

用仿函数修改排序规则,默认按照 key 值从小到大

cpp 复制代码
#include<iostream>
#include<map>
using namespace std;

// 仿函数
class MyCompare {
public:
	bool operator()(int v1, int v2) 
	{
		// 降序
		return v1 > v2;
	}
};

void test01() {
	map<int, int, MyCompare>m;
	// 第一种插入
	m.insert(pair<int, int>(1, 10));
	m.insert(make_pair(3, 20));
	m.insert(pair<int, int>(2, 30));

	for (map<int, int, MyCompare>::const_iterator it = m.begin(); it != m.end(); it++) {
		cout << "key = " << (*it).first << " value = " << it->second << endl;
	}
	cout << endl;

}



int main() {
	test01();

	system("pause");
	return 0;
}
相关推荐
神仙别闹1 小时前
基于 C++ 实现两个有序链表序列的交集
java·c++·链表
hansang_IR3 小时前
【题解】[APIO2023] 赛博乐园 / cyberland
c++·算法·图论
落羽的落羽4 小时前
【AI】快速理解AI应用的相关名词概念
linux·c++·人工智能·python·计算机网络·算法
刚入门的大一新生4 小时前
Linux-进程控制
linux·运维·服务器·c++
刃神太酷啦4 小时前
Redis 进阶核心:持久化 (RDB/AOF)、事务与主从复制全解析----《Hello Redis!》(5)
linux·c语言·数据库·c++·redis·缓存·bootstrap
喜欢吃燃面7 小时前
深入 C++ STL:从 unordered_set与unordered_map到底层哈希表的原理与实现
数据结构·c++·散列表
FlightYe8 小时前
音视频修炼之基础理论(五):AAC格式与解析
android·linux·c++·音视频·aac
ShineWinsu8 小时前
对于MySQL:数据库的操作的解析
linux·数据库·c++·mysql·面试·笔试·库的操作
云小逸9 小时前
C++ 第一阶段:对象、内存与生命周期
开发语言·c++
夜航海图9 小时前
S-57 数据解剖:把一个 ENC 文件拆给你看
c++