【C++】map和set

map和set是树形结构的关联式容器,使用平衡搜索树(红黑树)作为其底层结果,容器的元素是一个有序的序列。关联式容器是用来存储数据的,里面存储的是<key, value>结构的键值对,在数据检索时比序列式容器的效率更高。

键值对
键值对是用来表示具有一一对应关系的一种结构,该结构中一般包含两个成员变量key和value,key表示键值,value表示和key对应的信息。

map和set的作用比较
map O(logN)
1.快速查找,通过key查找value。map支持下标访问符,即在[]中放入key,就可以找到与key对应的value。
2.附带作用,对key进行排序。在内部,map中的元素总是按照键值key进行比较排序的。

set O(logN)
1.快速查找,key在不在
2.排序+去重

map的使用

#include <iostream>
#include <string>
#include <map>
using namespace std;

void TestMap()
{
	// key和value的类型都给成字符串
	map<string, string> m1;

	// C++11 的类表初始化
	map<string, string> m2{ { "apple", "苹果" },
	{ "banana", "香蕉" },
	{ "orange", "橘子" } };
	cout << m2["apple"] << endl;
	map<string, string> m3(m2);
	
	// 向map中插入元素对的方式:

	// 用pair直接来构造键值对
	m.insert(pair<string, string>("peach", "桃子"));
	// 用make_pair函数来构造键值对
	m.insert(make_pair("banana", "香蕉"));
	// 借用operator[]向map中插入元素
	m[""] = "水蜜桃";
	
	// 用迭代器去遍历map中的元素,可以得到一个按照key排序的序列
	for (auto& e : m)
		cout << e.first << "--->" << e.second << endl;

	// map中的键值对key一定是唯一的,如果key存在将插入失败
	auto ret = m.insert(make_pair("peach", "桃子"));
	if (ret.second)
		cout << "<peach, 桃子>不在map中, 已经插入" << endl;
	else
		cout << "键值为peach的元素已经存在:" << ret.first->first << "--->" <<
		ret.first->second << " 插入失败" << endl;

	// 删除key为"apple"的元素
	m.erase("apple");
	for (auto& e : m)
		cout << e.first << "--->" << e.second << endl;
	if (1 == m.count("apple"))
		cout << "apple还在" << endl;
	else
		cout << "apple被吃了" << endl;
}

总结:

  1. map中的的元素是键值对。
  2. map中的key是唯一的,并且不能修改。
  3. 默认按照小于的方式对key进行比较。
  4. map中的元素如果用迭代器去遍历,可以得到一个有序的序列。
  5. map的底层为平衡搜索树(红黑树),查找效率比较高。
  6. 支持[]操作符,operator[]中实际进行插入查找。

set的使用

#include <set>
void TestSet()
{
	// 用数组array中的元素构造set
	int array[] = { 1, 2, 3, 3, 5, 5, 6, 7, 9 };
	set<int> s(array, array + sizeof(array) / sizeof(array));
	cout << s.size() << endl;
	// 正向打印set中的元素,从打印结果中可以看出:set可去重
	for (auto& e : s)
		cout << e << " ";
	cout << endl;
	// set中值为3的元素出现了几次
	cout << s.count(3) << endl;
}

总结:

  1. set中插入元素时,只需要插入value即可,不需要构造键值对。
  2. set中的元素不可以重复(因此可以使用set进行去重)。
  3. 使用set的迭代器遍历set中的元素,可以得到有序序列。
  4. set中的元素默认按照小于来比较。
  5. set中的底层使用二叉搜索树(红黑树)来实现。
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值