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;
}
相关推荐
clint4561 天前
C++进阶(1)——前景提要
c++
夜悊2 天前
C++代码示例:进制数简单生成工具
c++
郝学胜_神的一滴2 天前
CMake 021: IF 条件判据详诠
c++·cmake
_wyt0012 天前
洛谷 B3930 [GESP202312 五级] 烹饪问题 题解
c++·gesp
玖玥拾2 天前
C/C++ 数据结构(七)栈、容器适配器
c语言·数据结构·c++··容器适配器
один but you2 天前
constexpr函数
c++
凡人叶枫2 天前
Effective C++ 条款41:了解隐式接口和编译期多态
java·开发语言·c++·effective c++
凡人叶枫2 天前
Effective C++ 条款42:了解 typename 的双重意义
java·linux·服务器·c++
小胖xiaopangss2 天前
BRpc使用
c++·rpc
-森屿安年-2 天前
63. 不同路径 II
c++·算法·动态规划