C++之关联容器(associative - container)简介
2016-06-05 19:49
441 查看
前言:本人没有算法基础就去刷leetcode,由于需要用到hash table,反映在C++上即关联容器。
一、Hash Table
是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。给定表M,存在函数f(key),对任意给定的关键字值key,代入函数后若能得到包含该关键字的记录在表中的地址,则称表M为哈希(Hash)表,函数f(key)为哈希(Hash) 函数。
Ex:统计单词或者文章中某单词出现的频率、数组中重复数字频率等问题
就我目前做的比较基础的leetcode题,有这些问题需要用到Hash Table
217. Contains Duplicate
242.
Valid Anagram
347.
Top K Frequent Elements
350.
Intersection of Two Arrays II
二、关联容器(associative
- container)
关联容器中的元素是按关键字来保存和访问和访问的。标准库提供8个关联容器1、按关键字有序保存元素
map 关联数组:保存(关键字-值)对
set 关键字即值,只保存关键字的容器
multmap 关键字可重复出现的map
multiset 关键字可重复出现的set
2、无序集合
unordered-map 用哈希函数组织的map
unordered-set 用哈希函数组织的set
unordered-multimap 哈希组织的map:关键字可以重复出现
unordered-multiset 哈希组织的set:关键字可以重复出现
Ex:使用map,统计单词出现的频率
<pre name="code" class="cpp">map<string,int> count; string word; for(string &i : word) count[word]++; //范围for语句
使用set,统计单词的时候,我们忽略"the"、"and"
<pre name="code" class="cpp">map<string,int> count; set<string> exclude = {"the","and"};string word; for(string &i : word) { if(exclude.find(word) == exclude.end()) count[word]++; } //find调用返回一个迭代器,如果给定关键字在set中,迭代器指向该关键字。否则,find返回尾后迭代器。所以仅当word不在exclude中时我们才更新word的计数器。