STL-unordermap

      在C++98中,STL提供了底层为红黑树结构的一系列关联式容器,在查询时效率可以达到log_2 N,即最差情况下需要比较红黑树的高度次,当树中的节点非常多时,查询效率也不理想。最好的查询是,进行很少的比较次数就能够将元素找到,因此在C++11中,STL又提供了4个unordered系列的关联式容器,这四个容器与红黑树结构的关联式容器使用方式 基本类似,只是底层结构不同。

unordered_map特点

  1. unordered_map是存储<key, value>键值对的关联式容器,其允许通过Keys快速的索引到与其对应的value。
  2. 在unordered_map中,键值通常用于唯一 地标识元素,而映射值是一个对象,其内容与此键关联。键和映射值的类型可能不同。
  3. 在内部,unordered_map没有对<key,value>按照任何特定的顺序排序,为了能在常数时间内找到所对应的value,unordered_map将相同哈希值的键值放在相同的桶中。
  4. unordered_map容器通过key访问单个元素要比map快,但它通常在遍历元素子集的范围迭代方面效率较低。
  5. unordered_map实现了直接访问操作符([]),他允许使用key作为参数直接访问value。
  6. 他的迭代器至少是前向迭代器

构造函数

函数名称功能介绍
unordered_map构造不同格式的unordered_map

容量

函数名称功能介绍
bool empty() const检测unordered_map是否为空
size_t size()const获取unordered_map的有效元素的个数

元素访问

函数名称功能介绍
operator[]返回与key对应的value

      注意:该函数中实际调用哈希桶的插入操作,用参数key与V()构造一个默认值往底层哈希桶中插入,如果key不在哈希桶中,插入成功,返回V(),否则插入失败,说明key已经在哈希桶中,将key对应的value返回

查询

函数名称功能介绍
iterator find(const K&key)返回key在哈希桶中的位置
size_t count(const K&key)返回哈希桶中关键码为key的键值对的个数

      注意:unordered_map中key是不能重复的,因此count函数的返回值最大为1

修改操作

函数名称功能介绍
insert向容器中插入键值对
erase删除容器中的键值对
void clear()清空容器中有效元素个数
void swap(unordered_map &)交换两个容器中的元素

桶操作

函数名称功能介绍
size_t bucket_count()const返回哈希桶中桶的总个数
size_t bucket_size(size_t n)const返回n号桶中有效元素的总个数
size_t bucket(const K& key)返回元素key所在的桶号

找到数组中出现次数为times的元素

class Solution{

public:
    int static repeatedNTimes(vector<int> &A, int times)
    {
        // 用unordered_map统计每个元素出现的次数
        unordered_map<int,int> m;
        for(auto e : A)
        {
            m[e]++;
        }

        // 找出出现次数为N的元素
        for(auto &e : m)
        {
            if(e.second == times)
            {
                return e.first;
            }
        }
        return 0;
    }

找出两个字符串中出现次数为1的单词

static vector<string> uncommonFromSentences(string first, string second)
    {
        unordered_map<string, int> m;
        PartionWord(first, m);
        PartionWord(second, m);

        vector<string> vRet;
        for(auto &e : m)
        {
            if(1 == e.second)
            {
                vRet.push_back(e.first);
            }
        }
        return vRet;
    }
    static void PartionWord(const string &str, unordered_map<string,int> &m)
    {
        string strWord;
        int start = 0;
        int last = 0;
        do
        {
            last = str.find(' ', start);
            strWord = str.substr(start, last - start);
            m[strWord]++;
            start = last + 1;
        }while(last != -1);
    }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值