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;
}
相关推荐
WBluuue2 小时前
Codeforces 1096 Div3(ABCDEFGH)
c++·算法
誰能久伴不乏2 小时前
ibmodbus “Invalid argument“ 错误的排查与修复
c++·qt·modbus
basketball6162 小时前
Kadane算法 C++实现
java·c++·算法
handler012 小时前
【C++】二叉搜索树详解及其模拟实现(代码)
开发语言·c++·算法·c··二叉搜索树·搜索树
luj_17682 小时前
残熵算法的稳健防灾逻辑
c语言·开发语言·c++·经验分享·算法
玖釉-2 小时前
二叉树基础详解:TreeNode、buildTree、deleteTree 与 printTree 的实现原理(C++)
c++·windows·算法
QiLinkOS2 小时前
从技术到资产的跃迁:企业专利布局的深层逻辑
c语言·数据结构·c++·单片机·嵌入式硬件·算法·开源
磊 子3 小时前
STL之deque和list以及两者与vector的对比
开发语言·c++·list
郝学胜_神的一滴3 小时前
CMake 012:Linux 下动态库与可执行程序的单文件构建
c++·cmake