• multimap和multiset 认知和使用


    之前只是在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的则是用红黑树实现的。

  • 相关阅读:
    纯CSS实现小三角提示信息
    PostGIS+QGIS+GeoServer+OpenLayers实现数据的存储、服务的发布以及地图的显示
    Arcgis for Js之Graphiclayer扩展详解
    Arcgis for JS扩展GraphicLayer实现区域对象的聚类统计与展示
    Arcgis for JS之Cluster聚类分析的实现(基于区域范围的)
    Arcgis for JS之Cluster聚类分析的实现
    Arcgis for Js之featurelayer实现空间查询和属性查询
    RESTful WebService入门
    使用 Spring 3 来创建 RESTful Web Services(转)
    基于Spring设计并实现RESTful Web Services(转)
  • 原文地址:https://www.cnblogs.com/George1994/p/6260763.html
Copyright © 2020-2023  润新知