C++黑马程序员——P231-235. map容器

发布时间 2023-08-17 13:39:15作者: 我会变强的
  • P231. map容器-构造和赋值
  • P232. ...-大小和交换
  • P233. ...-插入和删除
  • P234. ...-查找和统计
  • P235. ...-排序
  • P231. 构造和赋值

  

——————————————————————————————————————————————————————————

构造:

map<T1,T2> mp;  // map 默认构造

map(const map& map);  // 拷贝构造

赋值:

map& operator=(const map& map);  // 重载等号运算符

示例:

#include <iostream>
#include <map>
using namespace std;

// map 容器 构造和赋值

// 打印map容器
void printMap(map<int, int>& m) {
	for (map<int, int>::iterator it = m.begin(); it != m.end(); it++) {
		// ★★★两种方式访问
		cout << "key:" << (*it).first << "\tvalue:" << it->second << endl;
	}
}

void test01() {
	// ★★创建map容器
	map<int, int>m;
	// 插值
	m.insert(pair<int, int>(1, 10));	// ★★★pair<int, int>(1, 10)是匿名对组
	m.insert(pair<int, int>(4, 40));
	m.insert(pair<int, int>(3, 30));
	m.insert(pair<int, int>(2, 20));

	printMap(m);
	cout << endl;

	// 拷贝构造
	map<int, int>m2(m);    // ★★★
	cout << "m2:" << endl;
	printMap(m2);
	cout << endl;

	// 赋值
	map<int, int>m3;
	m3 = m;    // ★★★
	cout << "m3:" << endl;
	printMap(m3);
}

int main() {
	test01();
	return 0;
}

res:

  

虽然我们插入数据的时候,没有按key的大小顺序插入,但是打印出来发现map确实会按key值(不是value值)从小到大排序。

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

 

  • P232. 大小和交换

  

—————————————————————————————————————————————————————————

 示例:

#include <iostream>
#include <map>
using namespace std;

// map 容器 大小和交换

// 打印map容器
void printMap(map<int, int>& m) {
	for (map<int, int>::iterator it = m.begin(); it != m.end(); it++) {
		cout << "key:" << (*it).first << "\tvalue:" << it->second << 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));

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

// 交换
void test02() {
	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));

	map<int, int>m2;
	m2.insert(pair<int, int>(5, 100));
	m2.insert(pair<int, int>(6, 200));
	m2.insert(pair<int, int>(7, 300));

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

	// 交换
	m.swap(m2);	// ★★★
	cout << "交换后" << endl;
	cout << "m:" << endl;
	printMap(m);
	cout << "m2:" << endl;
	printMap(m2);
}

int main() {
	test01();
	test02();
	return 0;
}

res:

  

  • P233. 插入和删除

  

——————————————————————————————————————————————————————————

示例:

#include <iostream>
#include <map>
using namespace std;

// map 容器 插入和删除

// 打印map容器
void printMap(map<int, int>& m) {
	for (map<int, int>::iterator it = m.begin(); it != m.end(); it++) {
		cout << "key:" << (*it).first << "\tvalue:" << it->second << endl;
	}
	cout << endl;
}

void test01() {
	map<int, int>m;
	// 插入
	// ★★第一种
	m.insert(pair<int, int>(1, 10));
	// ★★★第二种
	m.insert(make_pair(2, 20));
	// 第三种(不建议)
	m.insert(map<int, int>::value_type(3, 30));
	// 第四种
	// []的方式不建议插入; 可以利用key访问value
	m[4] = 40;

	cout << m[5] << endl;	// 此时并没有key为5的值,但是map自己会造一个m[5]=0,对于我们来说这样不好
	printMap(m);

	// 删除
	m.erase(m.begin());	// ★★★按迭代器删除
	printMap(m);
	m.erase(3);	// ★★★删除键值(key)为3的对组
	printMap(m);
	m.erase(m.begin(), m.end());	// ★★★按区间删除
	// m.clear();	// ★★★清空
}

int main() {
	test01();
	return 0;
}

res:

  

  • P234. 查找和统计

  

——————————————————————————————————————————————————————————

#include <iostream>
#include <map>
using namespace std;

// map 容器 查找和统计

// 打印map容器
void printMultimap(multimap<int, int>& m) {
	for (map<int, int>::iterator it = m.begin(); it != m.end(); it++) {
		cout << "key:" << (*it).first << "\tvalue:" << it->second << endl;
	}
	cout << endl;
}

void test01() {
	// 查找
	map<int, int>m;
	m.insert(make_pair(1, 10));
	m.insert(make_pair(2, 20));
	m.insert(make_pair(3, 30));
	m.insert(make_pair(3, 40));		// ★★★map不允许插入重复的key值,对于重复插入的key值,只有第一次插入的有效

	map<int, int>::iterator pos = m.find(3);	// ★★★
	if (pos != m.end()) {
		cout << "查到了元素 key = " << pos->first << " value = " << pos->second << endl;
	}
	else {
		cout << "未找到元素" << endl;
	}
	// 统计
	// map不允许插入重复key元素,count要么是0要么是1
	// multimap的count可以大于1
	int num = m.count(3);	// ★★★
	cout << "num = " << num << endl;
	multimap<int, int>m2;	// ★★★
	m2.insert(make_pair(1, 10));
	m2.insert(make_pair(1, 20));
	m2.insert(make_pair(1, 10));
	int num2 = m2.count(1);
	cout << "num2 = " << num2 << endl;
	printMultimap(m2);
}

int main() {
	test01();
	return 0;
}

res:

  

  • P235. 排序

  

——————————————————————————————————————————————————————————

#include <iostream>
#include <map>
using namespace std;

// map 容器 排序

// 仿函数
class MyCompare {
public:
	// 降序
	bool operator()(int v1, int v2)const {	// ★★★在后面加const,否则报错
		return v1 > v2;
	}
};

void test01() {
	map<int, int, MyCompare>m;	// ★★★构造map容器的时候,如果想修改排序规则,加上仿函数; map<int, int, MyCompare>
	m.insert(make_pair(1, 10));
	m.insert(make_pair(2, 20));
	m.insert(make_pair(3, 30));
	m.insert(make_pair(4, 40));
	m.insert(make_pair(5, 50));
	for (map<int, int, MyCompare>::iterator it = m.begin(); it != m.end(); it++) {	// ★★★map<int, int, MyCompare>::iterator
		cout << it->first << "\t" << it->second << endl;
	}
}

int main() {
	test01();
	return 0;
}

res:

  

总结:

  • 利用仿函数可以指定map容器的排序规则
  • 对于自定义数据类型,map必须要指定排序规则,同set容器

(〃>_<;〃)(〃>_<;〃)(〃>_<;〃)