首页 > 编程语言 >C++黑马程序员——P231-235. map容器

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

时间:2023-08-17 13:44:59浏览次数:45  
标签:map cout insert 容器 P231 C++ pair make

  • 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容器

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

标签:map,cout,insert,容器,P231,C++,pair,make
From: https://www.cnblogs.com/wjjgame/p/17636412.html

相关文章

  • ConcurrentHashMap 源码详解
    ConcurrentHashMap是Java提供的一个并发散列映射实现,它允许多个线程同时读写而不需要同步整个数据结构。它是线程安全的,并且相比于其他线程安全的Map实现(如Collections.synchronizedMap或Hashtable),它提供了更高的并发性能。以下是ConcurrentHashMap的一些核心特性和相应......
  • C++之右值引用与完美转发与可变参数模板(万字长文详解)
    C++之右值引用与完美转发与可变参数模板左值引用和右值引用的概念​ 传统的C++语法中就有引用的语法,而C++11中新增了的右值引用语法特性,所以从现在开始我们之前学习的引用就叫做左值引用。无论左值引用还是右值引用,都是给对象取别名。那么到底什么是左值什么是右值呢?难道说赋......
  • windows下C++获取其它窗口中组件的信息
    抄自:https://pythonjishu.com/xfqbhrlejawmdfh/C++获得其他程序窗体控件中信息是一个比较常见的需求,例如在自动化测试、窗口助手等场景下都有可能用到。下面我们就介绍一下C++获得其他程序窗体控件中信息的方法。安装VisualStudio获得其他程序窗体控件中信息,在Windows下通过Wi......
  • C++11的新特性
    2.1.1longlong类型除字符和布尔类型外,其他整形用于表示不同尺寸的整形,一个longlong至少和一个long一样大,其中,数据类型longlong是在C++11中新定义的2.2.1列表初始化 ......
  • 漫谈 C++ 的各种检查
    原文:《漫谈C++的各种检查》为什么代码中需要各种检查?在C++中调用一个函数、使用一个类、实例化一个模板时,对传入的参数、使用的时机,往往会有很多 限制 (constraint/restriction)(例如,数值参数不能传入负数、对象的访问不是线程安全的、函数调用不能重入);而处理限制的方法有很......
  • c++的线程初探-2
    (目录)一、条件变量条件变量是一种线程同步机制。当条件不满足时,相关线程被一直阻塞,直到某种条件出现,这些线程才会被唤醒。C++11的条件变量提供了两个类:condition_variable:只支持与普通mutex搭配,效率更高。condition_variable_any:是一种通用的条件变量,可以与任意mutex搭配(包......
  • Memory map
    block7cortexinternalperipherals0xE0000000 block6 0xC0000000 Reserved0xBFFFFFFF0x60000000 block2Peripherals0x5FFFFFFF0x40000000APB1,APB2,AHB1,AHB2,block1SRAM0x3FFFFFFF0x20000000SRAMblock0  Code0x1FFFFFF......
  • Map
    1.遍历key,valueSetMap<String,String>fieldsMap=newHashMap<>();Set<String>keySet=fieldsMap.keySet();for(Stringkey:keySet){System.out.println(key+""+fieldsMap.get(key));}IteratorIteratoriterator=k......
  • C++ Constructor And Destructor
    ifyouhaveproblemswithconstructorsanddestructors,youcaninsertsuchprintstatementsinconstructorsforyourrealclassestoseethattheyworkasintended.Forlargerprograms,thisexactkindoftracingbecomestedious,butsimilartechniquesa......
  • 【转载】c++调用win32API控制打印机打印
    原文:https://blog.csdn.net/cheng448208985/article/details/55510687win32实现将原始数据发送给打印机1、调用OpenPrinter()打开打印机,获取打印机句柄。2、初始化DOCINFO打印机结构体。3、调用StartDocPrinter()表明应用程序准备发送文档数据给打印机。4、调用StartPagePrin......