【C++】提高编程——03STL常用容器——map/multimap容器

9 map/multimap容器

9.1 map 容器基本概念

  简介:
  map中所有元素都是pair,pair中第一个元素为key(键值),起到索引作用,第二个元素为value(值)。所有元素都会根据元素的键值自动排序
  本质:
  map/multimap属于关联式容器,底层结构是使用二叉树实现
  优点:
  可以根据key值快速找到value值
  map和multimap的区别:
  map不允许容器中有重复的key元素
  multimap允许容器中有重复的key值元素

9.2 map 构造和赋值

  功能描述:对map容器进行构造和赋值
  函数原型:
  (1)构造函数
  1.map< T1,T2> mp;——默认构造函数
  2.map(const map&mp);——拷贝构造函数
  (2)赋值函数
  map &operator=(const map &mp);——重载=运算符

#include<iostream>
using namespace std;
#include<string>
//包含容器头文件
#include <map>

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;
	}
}

 
void test01()
{
	//(1)map构造函数
	//1.默认构造函数
	map<int, int>m;
	m.insert(pair<int,int>(1,10));
	m.insert(pair<int,int>(2,32));
	m.insert(pair<int,int>(3,14));
	printMap(m);
	cout << endl;
	//2.拷贝构造函数
	map<int, int>m2(m);
	printMap(m2);
	cout << endl;
	
	//(2)map赋值操作
	map<int, int>m3 = m;
	printMap(m3);
}

 int main()
{
	test01();
}

9.3 map 大小和交换

  功能描述:统计map容器大小及交换map容器
  函数原型:
  (1)m.size();——返回容器中元素个数
  (2)m.empty();——判断容器是否为空
  (3)m1.swap(m2);——交换两个集合容器

#include<iostream>
using namespace std;
#include<string>
//包含容器头文件
#include <map>

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;
	}
}


void test01()
{
	map<int, int> m;
	m.insert(pair<int, int>(1, 10));
	m.insert(pair<int, int>(2, 32));
	m.insert(pair<int, int>(3, 14));
	printMap(m);
	cout << endl;
	//1.返回容器中元素个数:m.size()
	cout << "容器中元素个数为:" << m.size() << endl;

	//2.判断容器是否为空:
	if (m.empty())
	{
		cout << "map容器为空!" << endl;;
	}
	else
	{
		cout << "map容器不为空!" << endl;
	}
	//3.交换两个map
	map<int, int> m2 ;
	m2.insert(pair<int, int>(5, 16));
	m2.insert(pair<int, int>(4, 2));
	m2.insert(pair<int, int>(3, 33));
	cout << "交换前——————————" << endl;
	printMap(m);
	cout << endl;
	printMap(m2);
	cout << "交换后——————————" << endl;
	m.swap(m2);
	printMap(m);
	cout << endl;
	printMap(m2);
}

int main()
{
	test01();
}

9.4 map 插入和删除

  功能描述:对容器中的元素进行
  (1)插入(m.insert()
  (2)删除(m.erase()

  函数原型:
  (1)m.insert(elem);——在容器中插入元素
  (2)m.clear();——清空容器中所有元素
  (3)m.erase(pos);——删除pos迭代器所指的元素,返回下一个元素的迭代器
  (4)m.erase(beg,end);——删除区间[beg,end)的所有元素,返回下一个元素的迭代器
  (5)m.erase(key);——删除容器中key为key的元素

#include<iostream>
using namespace std;
#include<string>
//包含容器头文件
#include <map>

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;
	}
}


void test01()
{
	map<int, int> m;
	//(1)插入元素
	//1.插入元素:m.insert(pair<int,int>(d1,d2))
	m.insert(pair<int, int>(1, 10));
	m.insert(pair<int, int>(2, 32));
	m.insert(pair<int, int>(3, 14));
	m.insert(pair<int, int>(6, 2));
	m.insert(pair<int, int>(4, 18));
	//2.插入元素:m.insert(make_pair(d1,d2))
	m.insert(make_pair(5, 18));
	//3.插入元素:m[key]=value;
	m[8] = 21;
	printMap(m);
	cout << endl;
	
	//(2)删除元素
	//1.删除pos迭代器所指的元素
	map<int, int>::iterator it = m.begin();
	++it;
	m.erase(it);
	printMap(m);
	cout << endl;
	//2.删除区间[beg,end)迭代器之间的元素:m.erase(beg,end)
	m.erase(++m.begin(), --m.end());
	printMap(m);
	cout << endl;
	//3.删除容器中key=key的元素:m.erase(key)
	m.erase(1);
	printMap(m);
	cout << endl;
	//4.清除迭代器中所有元素:m.clear();
	m.clear();
	printMap(m);
}

int main()
{
	test01();
}

9.5 map 查找和统计

  功能描述:对map数组进行查找(m.find(key))和统计数据(m.count(key))
  函数原型:
  (1)m.find(key);——查找key是否存在,存在返回该键的元素的迭代器,不存在,返回m.end();
  (2)m.count(key);——统计key元素的个数

#include<iostream>
using namespace std;
#include<string>
//包含容器头文件
#include <map>

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;
	}
}


void test01()
{
	map<int, int> m;
	m.insert(pair<int, int>(1, 10));
	m.insert(pair<int, int>(2, 32));
	m.insert(pair<int, int>(3, 14));
	m.insert(pair<int, int>(6, 2));
	m.insert(pair<int, int>(4, 18));
	printMap(m);
	//1.查找:m.find(key),存在则返回该元素的迭代器,不存在返回m.end()
	map<int, int> ::iterator it = m.find(2);
	if (it != m.end())
	{
		cout << "查找成功!key=" <<(*it).first<<"value="<<(*it).second<< endl;
	}
	else
	{
		cout << "查找失败!" << endl;
	}
	//2.统计元素key的个数:m.count(key).map不允许插入重复数据,count函数来说返回结果要么为0要么为1
	cout << "原始key的个数为:" << m.count(2) << endl;
}

int main()
{
	test01();
}

9.6 map 容器排序

  学习目标:map容器默认排序规则为按照key值从小到大排序,掌握如何改变排序规则
  技术要点:利用仿函数,改变排序规则(本质是重载()运算符

#include<iostream>
using namespace std;
#include<string>
//包含容器头文件
#include <map>

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;
	}
}

//自定义仿函数
class MyCompare
{
public:
	bool operator()(int v1, int v2)
	{
		//默认排序规则是按照key升序排列,改变规则为降序
		return v1 > v2;
	}
};
void test01()
{
	//1.创建map容器并插入数据:默认排序为升序
	map<int, int> m;
	m.insert(pair<int, int>(1, 10));
	m.insert(pair<int, int>(2, 32));
	m.insert(pair<int, int>(3, 14));
	m.insert(pair<int, int>(6, 2));
	m.insert(pair<int, int>(4, 18));
	printMap(m);
	
	//2.创建map容器并插入数据:使用自定义排序方式
	map<int, int,MyCompare> m1;//传入排序规则函数
	m1.insert(pair<int, int>(1, 10));
	m1.insert(pair<int, int>(2, 32));
	m1.insert(pair<int, int>(3, 14));
	m1.insert(pair<int, int>(6, 2));
	m1.insert(pair<int, int>(4, 18));
	for (map<int, int,MyCompare>::iterator it = m1.begin(); it != m1.end(); it++)
	{
		cout << "key=" << (*it).first << " value=" << (*it).second << endl;
	}
}

int main()
{
	test01();
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值