zoukankan      html  css  js  c++  java
  • mutiplemap 总结

    之前只是在C++ Primer里面看过关联容器,可能因为没有实际用过,只是看看,所以导致用的时候并不熟悉;

    在这之前,map和set的特性应该要了解,map是关联数组,也就是由键值对组成的,而set只是关键字的集合,但是两者都只允许关键字是唯一的,也就是对于一个给定的关键字,它只能允许一个元素的关键字等于它;
    但是,容器multimap和multiset并没有这个限制,它们都允许多个元素具有相同的关键字。

    如何访问multimap呢,也就是如何查找元素呢?

    这个时候需要先了解multimap的函数:

    find(k) 返回第一个关键字为k的迭代器
    count(k) 返回关键字等于k的个数
    lower_bound(k) 返回第一个关键字不小于k的元素
    upper_bound(k) 返回第一个关键字大于k的元素
    equal_bound(k) 上面返回的是迭代器,但是这里返回的迭代器pair,表示关键字等于k的元素的范围,若k不存在,pair的两个成员均等于end()

    注意:多个相同的关键字存储在容器中时,则会相邻存储;

    根据以上的函数,可以使用三种方法进行查找元素

    第一种方法:find + count

    multimap<string, int> maps;
    string word("word");
    //注意是第一个出现的
    auto itr = maps.find(word);
    auto cnt = maps.count(word);
    //循环便利
    while (cnt) {
        cout << itr->second << endl;
        ++itr;
        cnt--;
    }
        
    

    第二种方法:lower_bound + upper_bound

    multimap<string, int> maps;
    string word("word");
    //其实就是一个区间,因为存储位置连续
    for (auto beg = maps.lower_bound(word), end = maps.upper_bound(word); beg != end; ++beg) {
        cout << beg->second << endl;
    }
    
    

    第三种方法:equal_range

    multimap<string, int> maps;
    string word("word");
    // 和上面不一样,直接返回一个区间
    for (auto pos = maps.equal_range(word); pos.first != maps.end(); ++pos.first) {
        cout << pos.first->second << endl;
    }
    
    

    对了还有unordered,这是没有进行排序的,同样的这些无序容器同样有重复关键字的版本-unordered_multimap,unordered_multiset,这些是用哈希函数实现,没有unordered的则是用红黑树实现的。

  • 相关阅读:
    HDU Problem 1811 Rank of Tetris【拓扑排序+并查集】
    POJ Problem 2367 Genealogical tree【拓扑排序】
    HDU Problem 2647 Reward【拓扑排序】
    HDU Problem 1285 确定比赛名次【拓扑排序】
    HDU Problem HDU Today 【最短路】
    HDU Problem 3665 Seaside【最短路】
    HDU Problem 一个人的旅行 【最短路dijkstra】
    HDU Problem 1596 find the safest road【最短路dijkstra】
    Beyond Compare文本合并进行内容替换要注意什么
    用这些工具都可以比较代码的差异
  • 原文地址:https://www.cnblogs.com/George1994/p/6399875.html
Copyright © 2011-2022 走看看