「C++」map和set的使用介绍

在这里插入图片描述


📄前言

stl容器分为两类,分别是序列容器和关联式容器,学习关联式容器可以帮助我们去解决去重等问题。

前置知识

在介绍set和map前,我们必须拥有一些必备的知识储备,比如像关联式容器与键值对等基础知识。

关联式容器

stl容器分为两类,分别是序列容器和关联式容器.

  • 序列式容器:像vector、list、deque等容器就是序列式容器。
  • 关联式容器:也可以用于存储数据,但在数据检索上比序列式容器高。

键值对

键值对指的是一种映射关系,这种结构拥有两个变量<key, value>,生活中也存在许多这样的键值对,比如你的身份证对应着你、英文的单词对应的意义。

map和set的底层结构

STL中的关联式结构有两种结构组成:树型结构(红黑树)和哈系结构,而map和set都是使用树型结构所构成的。

set

set 虽然只允许插入一个数值value,但其内部的实现还是键值对<value, value>,而且因为其允许冗余数据(重复数据),所以set还经常用于去重。

set的构造函数

函数接口说明
set (const key_compare& comp = key_compare(), const allocator_type& alloc = allocator_type());构造空的set
set (InputIterator first, InputIterator last, const key_compare& comp = key_compare(), const allocator_type& alloc = allocator_type());使用迭代器构建set
set (const set& x);拷贝构造

set 的修改操作

函数功能说明
pair<iterator, bool> insert(const, value_type& x )插入元素x,实际插入的是<x, x>构成的键值对,如果插入成功,返回<该元素在set中的位置,true>,如果插入失败,说明x在set中存在,返回<x在set的位置,false>
void erase(iterator position)删除set中position位置的节点
size_type erase( const key_type& x)删除set中值为x的元素,返回删除的元素的个数
void swap( set& x)交换两个set中的元素。
void clear()将set中的元素清空
void erase(iterator first, iterator last)删除set中(first, last)区间的元素
iterator find(const key_type& x) const返回值为x的迭代器
size_t count(const key_type& x)返回元素x出现的次数

set的使用

现在来看看使用的方式吧。

void test()
{
	vector<int> nums{1,2,3,4,3,4,5,6,7,8,9};
	//利用迭代器进行构造
	set<int> st(nums.begin(), nums.end());
	for(auto& key : st)
	{	//迭代器进行遍历
		cout << key << " ";
	}
	cout << endl;
	for(auto it = st.rbegin(); it != st.rend(); ++it)
	{	//反迭代器进行遍历
		cout << *it << " ";
	}
    cout << endl;
	cout << "st.count(): " << st.count(4) << endl;
}

在这里插入图片描述

map

map与set不同的是map是使用<key,value>的键值对,key可以唯一的标识value。

在这里插入图片描述

map的函数

map所拥有的函数基本和set保持一致,所以这里只介绍不同的地方

map
operator[ ]返回key对应的value
at()返回key对应的value

注意:operator[ ]和at()都是返回key对应的value的引用,但如果key不存在,operator[]会用默认key与value构建键值对并插入,返回这默认value,at()则直接抛出异常。

map的使用

void test()
{
    map<string, string> dict;
	dict.insert(make_pair("insert", "插入"));
	dict.insert(make_pair("erase", "删除"));
	dict.insert(make_pair("left", "左边"));
	dict.insert(make_pair("string", "字符串"));
	string str;
	while (cin>>str)	//查找单词
	{
		auto ret = dict.find(str);		//查找成功返回iterator position,失败返回end();
		if (ret != dict.end())
		{
			cout << str << ":" << ret->second << endl;
		}
		else
		{
			cout << "单词拼写错误" << endl;
		}
	}

	string strs[] = { "苹果", "西瓜", "苹果", "樱桃", "苹果", "樱桃", "苹果", "樱桃", "苹果" };
    map<string, int> m;
    for(auto& it : strs)
    {
        m[it]++;		//如果map中没有该key则创建一个
    }

    for(auto& it : m)
        cout << it.first << ":" << it.second << endl;
}

在这里插入图片描述

multiset 和 multimap

multiset和multimap 与其原生版本不同的是multi版本可以允许重复数据的存在,其接口和原生版本没有区别,但multimap和map除外,multimap没有了operator[]的接口。

📓总结

📜博客主页:主页
📫我的专栏:C++
📱我的github:github

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值