map和multimap的详解(C++)

16 篇文章 7 订阅

目录

1.map和multimap基本概念:

1)简介: 

2)本质:

3)map和multimap区别: 

2.map构造和赋值: 

1)功能描述:

2)构造:

3)赋值:

4)代码示例:

5)  总结:

3.map大小和交换: 

1) 功能描述:

2) 函数原型: 

3) 示例代码: 

4.map插入和删除 

1) 功能描述:

2) 函数原型:

3) 代码示例:

4) 总结:

5.map查找和统计:

1) 功能描述:

2) 函数原型:

3) 代码示例:

​4) 总结:

6.map容器排序:

7.不会自动排序的unordered_map


1.map和multimap基本概念:

1)简介: 

  • map中所有元素都是pair

  • pair中第一个元素为key(键值),起到索引作用,第二个元素为value(实值)

  • 所有元素都会根据元素的键值自动排序

2)本质:

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

3)map和multimap区别: 

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

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

2.map构造和赋值: 

1)功能描述:

对map容器进行构造和赋值操作

 2)构造:

  • map<T1, T2> mp; //map默认构造函数:
  • map(const map &mp); //拷贝构造函数

3)赋值:

  • map& operator=(const map &mp); //重载等号操作符

4)代码示例:

#include<iostream>
#include<map>
using namespace std;
void printMap(map<int, int>&m) {
	for (map<int, int>::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));
	printMap(m);
 
	map<int, int>m2(m);
	printMap(m2);
 
	map<int, int>m3;
	m3 = m2;
	printMap(m3);
 
	cout << (m3.find(3))->second << endl;
}
 
int main() {
	test01();
	system("pause");
	return 0;
}

 运行结果:

5)总结:

map中所有元素都是成对出现,插入数据时候要使用对组 pair<T,T> 

3.map大小和交换: 

1)功能描述:

统计map容器大小以及交换map容器

2)函数原型: 

  • size();    //返回容器中元素的数目
  • empty();  //判断容器是否为空
  • swap(st); //交换两个集合容器

3)示例代码: 

#include<iostream>
#include<map>
#include<string>
using namespace std;
 
void printMap(map<int, int>&m) {
	for (map<int, int>::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));
	printMap(m);
 
	cout << ((m.empty()) ? "m为空" : "m不为空,m的大小为:" +to_string(m.size())) << endl;
	cout << endl;
 
 
	map<int, int>m2;
	m2.insert(pair<int, int>(4, 2));
	m2.insert(pair<int, int>(5, 3));
	m2.insert(pair<int, int>(6, 4));
	printMap(m2);
 
	cout << "交换后:" << endl;
	m.swap(m2);
	printMap(m);
	printMap(m2);
}
 
int main() {
	test01();
 
	system("pause");
	return 0;
}

 运行结果:

 4) 总结:

  • 统计大小 --- size
  • 判断是否为空 --- empty
  • 交换容器 --- swap

4.map插入和删除 

1)功能描述:

map容器进行插入数据和删除数据

2)函数原型:

insert(elem);           //在容器中插入元素。
clear();       //清除所有元素
erase(pos);     //删除pos迭代器所指的元素,返回下一个元素的迭代器。
erase(beg, end);  //删除区间[beg,end)的所有元素 ,返回下一个元素的迭代器。
erase(key);      //删除容器中值为key的元素。 

3)代码示例:

#include<iostream>
#include<map>
#include<string>
using namespace std;
 
void printMap(map<int, int>&m) {
	for (map<int, int>::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(make_pair(2, 20));
	//第三种插入方式
	m.insert(map<int, int>::value_type(3, 30));
	//第四种插入方式(一般访问时用这个比较好,若key值不存在就会创建)
	m[4] = 40;
	printMap(m);
 
	//删除
	m.erase(m.begin());//根据位置删除元素
	printMap(m);
 
	m.erase(3);//根据键值删除元素
	printMap(m);
 
	//清空
	m.erase(m.begin(), m.end());//删除区间
	m.clear();
	printMap(m);
}
 
int main() {
	test01();
 
	system("pause");
	return 0;
}

 运行结果:

4)总结:

  • map插入方式很多,记住其一即可(建议一、二种)
  • 插入 --- insert
  • 删除 --- erase
  • 清空 --- clear

5.map查找和统计:

1) 功能描述:

对map容器进行查找数据以及统计数据

2) 函数原型:

  • find(key); //查找key是否存在,若存在,返回该键的元素的迭代器;若不存在,返回set.end();
  • count(key); //统计key的元素个数

3)  代码示例:

#include<iostream>
#include<map>
#include<string>
using namespace std;
 
void printMap(map<int, int>&m) {
	for (map<int, int>::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 num = m.count(3);
	cout << "num = " << num << endl;
}
 
int main() {
	test01();
 
	system("pause");
	return 0;
}

运行结果: 

 4)总结:

  • 查找 --- find (返回的是迭代器)
  • 统计 --- count (对于map,结果为0或者1)

6.map容器排序:

仿函数和自定义函数更改默认排序规则和Value值排序 。

map容器默认排序规则为 按照key值进行 从小到大排序,掌握如何改变排序规则

仿函数:就是在一个类中重载括号运算符。 

代码示例: 

#include<iostream>
#include<map>
#include<vector>
#include <algorithm>
 
using namespace std;
 
void printMap(map<int, int>&m) {
	for (map<int, int>::iterator it = m.begin(); it != m.end(); it++) {
		cout << "key=" << it->first << "  value=" << it->second << endl;
	}
	cout << endl;
}
//仿函数
class MyCompare {
public://降序
	bool operator()(int v1, int v2) {
		return v1 > v2;
	}
};
//普通函数
bool myCompare(const pair<int, int>&p1, const pair<int, int>&p2) {
	return p1.second > p2.second;
}
 
void test01() {
	map<int, int, MyCompare>m;//注意没括号,只是类名
 
	m.insert(make_pair(1, 80));
	m.insert(make_pair(2, 10));
	m.insert(make_pair(3, 20));
	m.insert(make_pair(4, 90));
	m.insert(make_pair(5, 30));
	//key值比较结果输出
	for (map<int, int, MyCompare>::iterator it = m.begin(); it != m.end(); it++) {
		cout << "key=" << it->first << "  value=" << it->second << endl;
	}

	cout << "……………………………………" << endl;

	//按value值比较
	vector<pair<int, int>>v;
	map<int, int>m1;
	m1[1] = 5;
	m1[2] = 4;
	m1[3] = 1;
	m1[4] = 2;
	for (map<int, int>::iterator it = m1.begin(); it != m1.end(); it++) {
		v.push_back(make_pair(it->first, it->second));
	}
	sort(v.begin(), v.end(), myCompare);
	for (vector<pair<int, int>>::iterator it = v.begin(); it != v.end(); it++) {
		cout << "key=" << it->first << "  value=" << it->second << endl;
	}
}
 
int main() {
	test01();
 
	system("pause");
	return 0;
}

运行结果:

 总结:

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

7.不会自动排序的unordered_map

引头文件< unordered_map>,其他multiunordered_map,set也一样,其他API基本就都一样。
在这里就不一一阐述了。

  • 13
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值