C++--unordered系列关联式容器简单介绍及应用代码

本文深入探讨了C++11中STL提供的四种unordered容器:unordered_map、unordered_set、unordered_multimap和unordered_multiset。文章详细介绍了这些容器的特性、使用方法及应用场景,包括如何插入、访问和删除元素,以及在实际问题中的应用示例。

声明:本人所有测试代码环境都为vs2017


在 C++11 中,STL 提供了 4 个 unordered 系列的关联式容器,这四个容器底层结构都是哈希桶,所以查找效率都非常快(O(1))。分别是:unordered_map 、 unordered_set 、unordered_multimap 和 unordered_multiset
本文对该四种容器进行了一些简单的介绍,以及一些接口的使用。最后举例在适合的题目场景的使用方式

1. unordered_map

unordered_map是存储<key, value>键值对的关联式容器,但是key值不能重复。

应用代码:

void Testunordered_map()
{
	unordered_map<string, string> m;
	//1.插入 
	   //通过pair结构体
	m.insert(pair<string, string>("小明", "18岁"));
	m.insert(pair<string, string>("小红", "19岁"));
	m.insert(pair<string, string>("小花", "17岁"));
	   //通过标准库全局函数make_pair
	m.insert(make_pair("小黑", "20岁"));
	
       //不能重复插入
	m.insert(make_pair("小明", "18岁"));//size的值不会改变

	//2.map的元素个数
	cout << "SIZE: " << m.size() << endl;  //--4
	//3.map中哈希桶的个数
	cout << "buket number: " << m.bucket_count() << endl; //--8
	//4.某号桶中的元素个数
	cout << "0号桶元素元素个数: " << m.bucket_size(0) << endl;//--0
	//5.某key对应的桶号
	cout << "小黑 所在的桶号: " << m.bucket("小黑") << endl; //--6

	//6.元素访问[]
	   //若key存在,直接返回key所对应的value值
	cout << m["小花"] << endl;  //--17岁
	cout << "SIZE: "<< m.size() << endl; // --4
	   //若key不存在,<key,默认value>会构成一个键值对,并插入容器,结果会返回默认的value,一般为空字符串
	cout << m["小牛"] << endl;  //" "
	cout << "SIZE: "<< m.size() << endl; //--5

	//7.删除
	m.erase("小牛");
	cout << "SIZE: " << m.size() << endl; //--4

	//8.清除
	m.clear();
	cout << "SIZE: " << m.size() << endl; //--0
}

2. unordered_multimap

unordered_multimap是存储<key, value>键值对的关联式容器,key值可以重复,但是没有[]元素访问。
应用代码:

void Testunordered_multimap()
{
	unordered_multimap<string, string> m;

	//重复插入元素
	m.insert(pair<string, string>("小明", "18岁"));
	cout << "SIZE: " << m.size() << endl; //---1
	m.insert(make_pair("小明", "18岁")); 
	cout << "SIZE: " << m.size() << endl; //--2

}

3. unordered_set

unordered_set是存储元素key的关联式容器,key不能重复。

void Testunordered_set()
{
	unordered_set<string> s;

	//插入
	s.insert("小明");
	s.insert("小红");
	s.insert("小花");

	cout << s.size() << endl;

	//迭代器
	unordered_set<string>::iterator it = s.begin();
	while (it != s.end())
	{
		cout << *it << " ";
		++it;
	}
}

4. unordered_multiset

unordered_set是存储元素key的关联式容器,key可以重复。

void Testunordered_multiset()
{
	unordered_multiset<string> s;

	//插入
	s.insert("小明");
	s.insert("小红");
	s.insert("小花");

	cout << s.size() << endl;

	//可以重复插入
	s.insert("小明");
	cout << s.size() << endl;
	unordered_set<string>::iterator it = s.begin();
	while (it != s.end())
	{
		cout << *it << " ";
		++it;
	}
}

5. 解题应用

力扣–961 查找重复N次的字符

class Solution {
public:
    int repeatedNTimes(vector<int>& A) {
        unordered_map<int,int> m;
        for(auto e:A)
        {
            m[e]++;
        }
        int N=A.size()/2;
        for(auto e:m)
        {
            if(e.second==N)
            {
                return e.first;
            }
        }
        return 0;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值