C++中不得不说的map容器

来自:网络
时间:2022-08-07
阅读:
目录

前言

为什么这两天在研究C++的容器呢,因为刷题的时候碰见了几个不擅长的题,得用STL中的几种容器才能解出来,所以也是动力满满呀,希望能尽快转过头去把那几个题给写出来,哈哈哈,当然,解题思路和过程后续我也会分享出来。话不多说,老规矩,

使用map容器要包含头文件#include<map>

1,map基本概念

简介:

  map中所有元素都是pair(成对出现的数)

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

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

本质:

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

优点

  可以根据key值快速找到value值

map和multimap的区别:

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

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

2,map构造和赋值

功能描述: 

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

代码实现:

#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容器 1,默认构造
	map<int, int>m;  //要写两个数据类型
	m.insert(pair<int, int>(1, 10));
	m.insert(pair<int, int>(3, 30));  //与插入的顺序无关
	m.insert(pair<int, int>(2, 20));  //容器会根据key值进行自动排序
	m.insert(pair<int, int>(4, 40));
	printMap(m);
 
	//2,拷贝构造
	map<int, int>m2(m);
	printMap(m2);
 
	//3,赋值
	map<int, int>m3;
	m3 = m2;  //等号方式赋值
	printMap(m3);
}
int main() {
	test01();
	return 0;
}

3,大小和交换

功能描述:

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

函数原型:

size(); //返回容器中元素的个数

empty(); //bool类型,判断容器是否为空

swap(st); //交换两个集合容器

4,插入和删除

功能描述:

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

代码实现:

#include<iostream>
#include<map>
using namespace std;
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));
 
	//第四种插入
	m[4] = 40;
 
	//第一种删除
	m.erase(m.begin()); //参数为迭代器
 
	//第二种删除
	m.erase(1); //按照key删除
 
	//第三种删除
	m.erase(m.begin(), m.end()); //区间删除
 
	//第四种删除
	m.clear(); //全部删除
}
int main() {
	test01();
	return 0;
}

5,查找和统计

功能描述:

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

函数原型:

  find(key);

/*查找key是否存在,若存在,返回该元素的迭代器;

若不存在,返回end()迭代器*/

  count(key);     // 统计key的元素个数

/*map不允许插入重复key值,count统计结果要么是0,要么是1

multimap的count统计结果可能大于1*/

6,排序

  map容器默认的排序方式是,按照key值进行从小到大的排序,但是我们可以利用仿函数实现从大到小排序,话不多说,直接上代码

#include<iostream>
#include<map>
using namespace std;
class MyCompare
{
public:
	bool operator()(int v1,int v2)const
	{
		return v1 > v2;  //降序
	}
};
void test01()
{
	map<int, int, MyCompare>m;  //加入仿函数
	m.insert(make_pair(1, 10)); 
	m.insert(make_pair(2, 20));
	m.insert(make_pair(3, 30));
	m.insert(make_pair(4, 40));
	for (map<int, int,MyCompare>::iterator it = m.begin(); it != m.end(); it++) {//输出的时候别忘了加上
		cout << "key=" << it->first << " value=" << it-> second << endl;
	}
}
int main() {
	test01();
	return 0;
}

另外,对于自定义数据类型,map必须要指定排序规则。

总结

返回顶部
顶部