STL:map/multimap容器详解

map容器中所有元素都是pair,pair中第一个元素为key(键值),起到索引作用,第二个元素为value(实值)。相信学过python的就知道这和python中的字典十分类似。同时,所有元素都会根据元素的键值自动排序。map/multimap属于关联式容器,底层数据结构是用二叉树实现的。它的优点就是可以根据key值快速找到value值。
这里需要了解map与multimap的区别:
即map不予许容器中有重复的key值元素;而multimap允许容器中有重复的key值元素,这里的区别与set与multiset十分类似

1.map容器的构造与赋值

函数描述
map<T,T> mmap默认构造函数
map(const map &mp)拷贝构造函数
map& operator=(const map &mp)重载等号操作符

具体代码的使用如下所示:

#include<iostream>
#include<map>
using namespace std;
//map容器的构造与赋值
void printMap(map<int,int> &m) {
	for (auto it = m.begin(); it != m.end(); it++) {
		cout << "key =" << it->first << " value =" << it->second << endl;
	}
	cout << endl;
}
int main() {
	//创建map容器
	map<int, int> m;
	//插入数据里面需要传入的是对组
	m.insert(pair<int, int>(1, 10));//pair<int, int>(1, 10)为匿名二元组
	m.insert(pair<int, int>(3, 30));
	m.insert(pair<int, int>(4, 40));
	m.insert(pair<int, int>(2, 20));
	//插入元素后会根据key自动进行升序排列
	printMap(m);
	
	//拷贝构造
	map<int, int> m2(m);
	printMap(m2);

	//赋值
	map<int, int> m3;
	m3 = m2;
	printMap(m3);
	return 0;
}

这里尤其需要注意的是,map容器中所有的元素都是成对出现的,插入数据的时候要使用二元组,即对组pair。

2.map容器的大小与交换

函数描述
size()返回容器中元素的数目
empty()判断容器中是否为空
swap(st)交换两个集合容器
#include<iostream>
#include<map>
using namespace std;
//map容器的大小与交换
void printMap(map<int,int> &m) {
	for (auto it = m.begin(); it != m.end(); it++) {
		cout << "key值为:" << it->first << " value值为:" << it->second << endl;
	}
	cout << endl;
}
int main() {
	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));
	if (m.empty()) {
		cout << "m容器为空" << endl;
	}
	else {
		cout << "m容器不为空" << endl;
		cout << "m的大小为:" << m.size() << endl;
	}
	//交换
	map<int, int> m2;
	m2.insert(pair<int,int>(4, 40));
	m2.insert(pair<int,int>(6, 60));
	m2.insert(pair<int,int>(5, 50));
	cout << "map容器交换前" << endl;
	printMap(m);
	printMap(m2);
	cout << "map容器交换后" << endl;
	m.swap(m2);
	printMap(m);
	printMap(m2);
	return 0;
}

3.map容器的插入与删除

函数描述
insert(elem)在容器中插入元素
clear()清除所有元素
erase(pos)删除pos迭代器所指的元素,返回下一个元素的迭代器
erase(beg,end)删除区间[beg,end)的所有元素,返回下一个元素的迭代器
erase(key)删除容器中值为key的元素
#include<iostream>
#include <map>
using namespace std;
//map容器的插入与删除操作
void printMap(map<int,int> &m) {
	for (auto it = m.begin(); it != m.end(); it++) {
		cout << "key值为:" << it->first << " value值为:" << it->second << endl;
	}
	cout << endl;
}
int main() {
	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
	//使用[]插入元素的时候,如果key不存在将会自动创建键值对
	m[4] = 40;
	printMap(m);
	//删除
	m.erase(m.begin());
	printMap(m);
	//删除 直接传入key
	m.erase(3);
	printMap(m);
	//全部删除
	m.clear();//相当于m.erase(m.begin(),m.end())
	printMap(m);
	return 0;
}

4.map容器的查找与统计

函数描述
find(key)查找key是否存在,返回该键的元素的迭代器;若不存在返回map.end()
count(key)统计key的元素的个数
#include<iostream>
#include<map>
using namespace std;
int main() {
	//查找
	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));
	//查找键为3的键值对
	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
	int num=m.count(3);//返回结果为整型
	cout << "num=" << num << endl;
	return 0;
}

这里需要注意的是,find返回的是迭代器,而count返回的是整型!

  • 5
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
C++ STL中的mapmultimap是关联容器,用于存储键值对(key-value pairs),其中每个键(key)唯一对应一个值(value)。 map是一个有序容器,根据键的大小进行自动排序,默认按照键的升序进行排序。每个键只能在map中出现一次,如果尝试插入具有相同键的元素,新元素将替代旧元素。 multimap也是一个有序容器,与map不同的是,它允许多个具有相同键的元素存在。多个具有相同键的元素将按照插入的顺序进行存储,而不会自动排序。 这两个容器都提供了一系列的操作函数,如insert、erase、find等,用于插入、删除和查找元素。 以下是一个使用map的简单示例: ```cpp #include <iostream> #include <map> int main() { std::map<std::string, int> scores; scores.insert(std::make_pair("Alice", 90)); scores.insert(std::make_pair("Bob", 80)); scores.insert(std::make_pair("Charlie", 70)); // 查找并输出Bob的分数 std::cout << "Bob's score: " << scores["Bob"] << std::endl; // 遍历并输出所有键值对 for (const auto& pair : scores) { std::cout << pair.first << ": " << pair.second << std::endl; } return 0; } ``` 上述示例中,我们创建了一个存储string类型键和int类型值的map容器scores。通过insert函数依次插入了三个键值对。然后我们通过scores["Bob"]来获取Bob的分数,并输出结果为80。 接着我们使用范围-based for循环遍历map中的所有键值对,并输出每个键值对的键和值。 multimap的用法与map类似,只是它允许多个具有相同键的元素存在。 这些关联容器在查找和插入操作上具有较高的效率,特别适用于需要根据键进行快速查找的场景。在实际应用中,你可以根据自己的需求选择适合的容器类型。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

散一世繁华,颠半世琉璃

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值