关联容器unordered_map详解

unordered_map

unordered_map是一个存储由keyvalue映射值组成的关联容器。该key值用于唯一表示该元素,而映射值是该key值关联的内容。keyvalue都可以被预定义或用户定义为任何类型。

在内部,unordered_map是用HashTable来实现,该key提供的映射被哈希为哈希表的索引,这也就是为什么数据结构的性能很大程度上依赖于哈希后函数。而从哈希表中search,insert,delete操作,平均复杂度为O(1).

下面是C++程序演示unordered_map功能的例子。

#include<iostream>
#include<unordered_map>
using namespace std;
int main(int argc, char const *argv[]) {
  //声明一个<string,int>类型的umap
  unordered_map<string,int> umap;

  //使用[]操作符插入值
  umap["GeeksforGeeks"]=10;
  umap["FEEL"]=1999;
  umap["Contribute"]=30;
  
  for(auto x:umap){
    cout<<x.first<<" "<<x.second<<endl;
  }
  return 0;
}

输出结果:

GeeksforGeeks 10
Contribute 30
FEEL 1999

unordered_map vs unordered_set

unordered_set中,只有key,没有value,主要用于查看在一个集合中是否存在。例如,考虑单个单词的频率计数问题,我们不能使用unordered_set(或set),因为无法存储计数个数.

unordered_map vs map

map(与set类似)是一个有唯一值的有序序列,在unordered_mapkey可以存储任何顺序:有序和无序。Map是作为一个平衡树的实现,这也是它为什么可以维护元素之间的顺序(通过特定的树遍历).Map操作的时间复杂度为O(Log n),对于unordered_set平均复杂度为O(1).

methods on unordered_map

unordered_map中有相当多函数,其中最有用的有operator=,operator[],empty,size,capacity,begin,end,iterator,find,和count,insert,earse等方法。

我们可以使用iterator遍历unordered_map所有元素。下面是一个初始化,索引,迭代的例子:

#include<iostream>
#include<unordered_map>
using namespace std;
int main() {
  //声明一个<string,int>类型的umap
  unordered_map<string,int> umap;

  umap["PI"]=3.14;
  umap["root2"] = 1.414;
  umap["root3"] = 1.732;
  umap["log10"] = 2.302;
  umap["loge"] = 1.0;

  //通过insert函数插入值
  umap.insert(make_pair("e",2.112));
  string key="PI";

  if(umap.find(key)==umap.end()){
    cout<<key<<" not exit!"<<endl;
  }
  else{
    cout<<"Found "<<key<<endl;
  }

  //遍历umap中的所有值
  // unordered_map<string,double>::iterator it;
  cout<<endl<<"All Elements:"<<endl;
  for(auto it=umap.begin();it!=umap.end();it++){
    cout<<it->first<<" "<<it->second<<endl;
  }
  for(auto x:umap){
    cout<<x.first<<" "<<x.second<<endl;
  }
  return 0;
}

输出结果:

Found PI

All Elements:
loge 1
e 2
log10 2
root3 1
PI 3
root2 1
loge 1
e 2
log10 2
root3 1
PI 3
root2 1

  • 下面是一个基于unordered_map的实际问题——给定串单词,找出每个单词出现的次数。

    Input : str = “geeks for geeks geeks quiz practice qa for”;

    Output : Frequencies of individual words are

    (practice, 1)

    (for, 2)

    (qa, 1)

    (quiz, 1)

    (geeks, 3)

    关于这个问题,采用unordered_map来解决代码如下:

#include<bits/stdc++.h>
 using namespace std;
 
 void printS(const string &s){
   unordered_map<string,int> umap;
 
   stringstream ss(s);
   string word;
   while(ss>>word){
     umap[word]++;
   }
   for(auto it=umap.begin();it!=umap.end();it++){
     cout<<"("<<it->first<<","<<it->second<<")"<<endl;
   }
 }
 
 int main() {
   string s="geeks for geeks geeks quiz practice qa for";
   printS(s);
   return 0;
 }

Methods of unordered_map

  • at(): 返回指定key的值的引用

  • begin():返回指向unordered_map的第一个元素的迭代器

  • end():返回指向unordered_map的最后一个元素的迭代器

  • bucket():返回mapkey为指定值的bucket值,即索引

  • bucket_count:得到bucket的个数

  • bucket_size: 返回bucket的大小

  • count():使用给定key获取在unordered_map中出现的次数

  • equal_range: 使用一个等于kkey键来返回包含容器中所有元素的范围的边界,

  • equal_range示例:

#include<bits/stdc++.h>
using namespace std;
typedef unordered_map<char,char> gfg;

int main() {
  gfg g;

  g.insert(gfg::value_type('a','b'));
  g.insert(gfg::value_type('b','d'));
  g.insert(gfg::value_type('e','f'));

  //’f'作为‘key’,
  pair<gfg::iterator,gfg::iterator> p1=g.equal_range('f');

  //不存在'f'
  cout<<"nsearch for f:";
  for(;p1.first!=p1.second;++p1.first){
    cout<<p1.first->first<<","<<p1.first->second<<endl;
  }

  p1=g.equal_range('a');

  cout << "\nsearch for 'a' : [";
    for (; p1.first != p1.second; ++p1.first) {
        cout << p1.first->first << ", " << p1.first->second << "]"<<endl;
    }

  return 0;
}

输出:

nsearch for f:
search for ‘a’ : [a, b]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一倾而尽

你的鼓励将是我最大的动力,谢谢

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值