set与map

set与map的特性及区别

在STL中实现了树形结构(红黑树)和哈希结构(哈希桶)两种管理式结构。其中树形结构主要有set、map、multiset、multimap四种。

set

set用于存储一个键值(key),支持高效的关键字查询,同时具有排序和去重的特性。

int main()
{
	set<int> test;
	test.insert(7);
	test.insert(7);
	test.insert(7);
	test.insert(11);
	test.insert(4);
	test.insert(1);
	test.insert(6);
	test.insert(10);

	for (auto x : test)
	{
		cout << x << " ";
	}
	cout << endl;
	return 0;
}

 

 set常用接口的使用

注:查找接口find,如果找得到则返回一个指向查找的key的迭代器,找不到则返回  end()  。

int main()
{
	set<int> test;

	//insert插入
	test.insert(7);
	test.insert(7);
	test.insert(7);
	test.insert(11);
	test.insert(4);
	test.insert(1);
	test.insert(6);
	test.insert(10);

	//范围for遍历,本质上就是迭代器遍历
	for (auto x : test)
	{
		cout << x << " ";
	}
	cout << endl;

	//查找
	if (test.find(7) != test.end())
		cout << "找到了" << endl;


	//删除
	test.erase(6);
	test.erase(1);

	cout << "删除1、6后: ";
	for (auto x : test)
	{
		cout << x << " ";
	}
	cout << endl;

	//清空
	test.clear();

	cout << "清空后: ";
	for (auto x : test)
	{
		cout << x << " ";
	}
	cout << endl;
	return 0;
}

 

multiset与set的使用方法完全一致,唯一区别是multiset不会去重。如图,依旧保留了多个7。

 

map

map用于存储  <键值(key),数值(value)>  这样一对数值,通过关键字与数值建立映射关系,可以通过关键字去寻找到对应的数值,会根据键值来进行排序和去重操作。键值是唯一的不可修改,数值不是唯一的。

map常用接口的使用

在这里以<水果,个数>为例简单介绍一下map的接口。

插入时要注意,因为存储的是pair<string,int>,所以有这样三种插入方式:

  1. test.insert(pair<string,int>("西瓜", 9));
  2. test.insert(make_pair("西瓜", 8));
  3. test.insert({ "西瓜",7 });
int main()
{
	map<string,int> test;

	//insert插入
	test.insert(pair<string,int>("西瓜", 9));
	test.insert(make_pair("西瓜", 8));
	test.insert({ "西瓜",7 });

	test.insert({ "草莓",1 });
	test.insert({ "芒果",2 });
	test.insert({ "苹果",3 });

	//范围for遍历,本质上就是迭代器遍历
	for (auto x : test)
	{
		cout << x.first << " " << x.second << endl;
	}
	cout << endl;

	//查找
	if (test.find("西瓜") != test.end())
		cout << "找到了个数是"<<test["西瓜"] << endl;


	//删除
	test.erase("西瓜");
	test.erase("草莓");

	cout << "删除西瓜、草莓后: ";
	for (auto x : test)
	{
		cout << x.first << " " << x.second << endl;
	}
	cout << endl;

	//清空
	test.clear();

	cout << "清空后: ";
	for (auto x : test)
	{
		cout << x.first << " " << x.second << endl;
	}
	cout << endl;
	return 0;
}

 map的重载运算符[ ]

可以直接通过   变量名[key]  去访问其对应数值,如果不存在则会进行插入操作。

int main()
{
	map<string,int> test;

	//insert插入
	test.insert(pair<string,int>("西瓜", 9));
	test.insert(make_pair("西瓜", 8));
	test.insert({ "西瓜",7 });

	test.insert({ "草莓",1 });
	test.insert({ "芒果",2 });
	test.insert({ "苹果",3 });

	test["西瓜"]++;
	test["草莓"] = 16;
	//找不到榴莲,则进行插入。
	test["榴莲"];

	//范围for遍历,本质上就是迭代器遍历
	for (auto x : test)
	{
		cout << x.first << " " << x.second << endl;
	}
	cout << endl;

	return 0;
}

 同理multimap与map的使用方法也完全一致,区别还是multiset不会根据key去重。

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值