C++STL笔记十:map/multimap容器;

本文详细介绍了C++ STL中的map和multimap容器,包括它们的基本概念、构造与赋值、插入与删除元素、查找与统计、以及自定义排序规则。map是一个不允许重复键值的关联容器,而multimap则允许键值重复。通过实例展示了如何插入、删除元素以及如何根据键值进行查找。此外,还讲解了如何利用仿函数改变排序规则,使map按照自定义方式进行排序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Key_Value结构的字典终于登场了。

map/multimap简介:

  • map中所有元素都是pair
  • pair中第一个元素为key(键值),起到索引作用,第二个元素为value(实值)
  • 所有元素都会根据元素的键值自动排序

本质:

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

优点:

  • 可以根据key键值快速找到对应的value值。

map和multimap区别:

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

构造和赋值

函数原型:

构造:

  • map<T1, T2> mp; //map默认构造函数:

  • map(const map &mp); //拷贝构造函数

赋值:

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

void test01()
{
	// 创建map容器
	map<int, int> m;
	// map中所有元素都是成对出现的,插入数据时候要使用对组。map会自动根据key值排序。
	m.insert(pair<int, int>(3, 10));   // 里面其实是一个匿名对组。
	m.insert(pair<int, int>(2, 30)); 
	m.insert(pair<int, int>(4, 40));   
	m.insert(pair<int, int>(1, 60));
	printMap(m);
	// 拷贝构造:
	map<int, int> m2(m);   // 拷贝构造。
	map<int, int> m3(m);   // 拷贝构造。

	m2 = m3;   // 赋值。
}

打印输出:

void printMap(const map<int, int>& m)
{
	for (map<int, int>::const_iterator it= m.begin(); it !=m.end(); it++)
	{
		cout << "Key = " << (*it).first << ",Value = " << (*it).second << endl;
	}
}

总结:

  • map中所有元素都是成对出现的,插入输入时要使用对组pair。


map容器和大小

函数原型:

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

  • empty(); //判断容器是否为空

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



map插入和删除元素

函数原型:

  • insert(elem); //在容器中插入元素。

  • clear(); //清除所有元素

  • erase(pos); //删除pos迭代器所指的元素,返回下一个元素的迭代器。

  • erase(beg, end); //删除区间[beg,end)的所有元素 ,返回下一个元素的迭代器。

  • erase(key); //删除容器中值为key的元素。按照key来删除数据。

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

	// []不建议使用,用途,可以利用key访问到value
	cout << m[4] << endl;   // 如果在map中没有m标记的索引为4的元素,则会将m[4] = 0;所以一般不会用第四种插入方式。

	// 删除:
	m.erase(3);  // 删除key为3的值。

	m.erase(m.begin());
	m.erase(m.begin(), m.end());
	m.clear();
}


map查找和统计

函数原型:

  • find(key);       // 查找key是否存在,
    • 若存在,则返回该键的元素的迭代器;
    • 如果不存在,返回set.end();
  • count(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容器排序

利用仿函数,可以改变容器的排序规则。

仿函数:就是重载了函数调用运算符()仿函数本质上是一个类型。

构造两个类型:

class Person 
{
public:
	Person(string name, int age)
	{
		this->m_Name = name;
		this->m_Age = age;
	}

	string m_Name;
	int m_Age;
};

enum Level
{
	 A,
	 B,
	 C
};

仿函数:规定排序规则。

class MyCompare
{
public:
	bool operator()(Person p1, Person p2)const
	{
		return p1.m_Age < p2.m_Age;
	}
};
void test01()
{
	map <Person, Level,MyCompare> m;
	
	Person p1("张三", 18);
	Person p2("李四", 20);
	Person p3("王五", 19);
	
	m.insert(pair<Person, Level>(p1, A));
	m.insert(pair<Person, Level>(p2, B));
	m.insert(pair<Person, Level>(p3, C));

	for (map<Person, Level>::iterator it = m.begin(); it != m.end(); it++)
	{
		cout << "姓名:" << it->first.m_Name << ",年龄:" << it->first.m_Age << ",Level:"
			<< it->second << "。" << endl;
	}
	cout << endl;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值