zoukankan      html  css  js  c++  java
  • C++ STL MultiMap2

    模板

    template < class Key,                                     // multimap::key_type
               class T,                                       // multimap::mapped_type
               class Compare = less<Key>,                     // multimap::key_compare
               class Alloc = allocator<pair<const Key,T> >    // multimap::allocator_type
               > class multimap;
    

    multimap是关联型容器,保存<key,value>键值对,多个值可以由相同的键。
    map中的元素根据key和比较器排序。
    在对单个元素索引时,会比unordered_multimap要慢一些。
    但是multimap允许按照顺序查找一个子集。

    特性

    • 关联关联:关联容器中的元素由其键引用,而不是由它们在容器中的绝对位置引用。
    • 排序有序:容器中的元素始终遵循严格的顺序。所有插入的元素按此顺序给出一个位置。
    • 键值对映射:每个元素将键与映射值相关联:键用于标识主要内容为映射值的元素。
    • 允许相同键多个等效键:容器中的多个元素可以具有等效键。
    • 分配器感知:容器使用分配器对象来动态处理其存储需求

    插入

    #include <iostream>
    #include <map>
    #include <string>
    using namespace std;
    
    int main()
    {
        // type of the collection
        typedef multimap<int,string> IntStringMMap;
    
        IntStringMMap coll;        // set container for int/string values
    
        // insert some elements in arbitrary order
        // - a value with key 1 gets inserted twice
        coll.insert(make_pair(5,"tagged"));
        coll.insert(make_pair(2,"a"));
        coll.insert(make_pair(1,"this"));
        coll.insert(make_pair(4,"of"));
        coll.insert(make_pair(6,"strings"));
        coll.insert(make_pair(1,"is"));
        coll.insert(make_pair(3,"multimap"));
    
        /* print all element values
         * - iterate over all elements
         * - element member second is the value
         */
        IntStringMMap::iterator pos;
        for (pos = coll.begin(); pos != coll.end(); ++pos) {
            cout << pos->first <<":	" << pos->second << std::endl;
        }   
        cout << endl;
    }
    

    输出

    1:  this
    1:  is
    2:  a
    3:  multimap
    4:  of
    5:  tagged
    6:  strings
    

    查找

    如果一个键对应多个值,官方文档并没指出会按什么规则返回哪一个值。

    // multimap::find
    #include <iostream>
    #include <map>
    
    int main ()
    {
      std::multimap<char,int> mymm;
    
      mymm.insert (std::make_pair('x',10));
      mymm.insert (std::make_pair('y',20));
      mymm.insert (std::make_pair('z',30));
      mymm.insert (std::make_pair('z',40));
    
      std::multimap<char,int>::iterator it = mymm.find('x');
      mymm.erase (it);
      mymm.erase (mymm.find('z'));
    
      // print content:
      std::cout << "elements in mymm:" << '
    ';
      std::cout << "y => " << mymm.find('y')->second << '
    ';
      std::cout << "z => " << mymm.find('z')->second << '
    ';
    
      return 0;
    }
    

    输出

    elements in mymm:
    y => 20
    z => 40
    

    equal_range

    pair<const_iterator,const_iterator> equal_range (const key_type& k) const;
    pair<iterator,iterator>             equal_range (const key_type& k);
    

    返回键对应的所有元素的起始和结束迭代器。该函数返回一对,其pair:: first 是范围的下限(与lower_bound相同),而pair::second 是上限(与upper_bound相同)。

    // multimap::equal_range
    #include <iostream>
    #include <map>
    
    int main ()
    {
      std::multimap<char,int> mymm;
    
      mymm.insert(std::pair<char,int>('a',10));
      mymm.insert(std::pair<char,int>('b',20));
      mymm.insert(std::pair<char,int>('b',30));
      mymm.insert(std::pair<char,int>('b',40));
      mymm.insert(std::pair<char,int>('c',50));
      mymm.insert(std::pair<char,int>('c',60));
      mymm.insert(std::pair<char,int>('d',60));
    
      std::cout << "mymm contains:
    ";
      for (char ch='a'; ch<='d'; ch++)
      {
        std::pair <std::multimap<char,int>::iterator, std::multimap<char,int>::iterator> ret;
        ret = mymm.equal_range(ch);
        std::cout << ch << " =>";
        for (std::multimap<char,int>::iterator it=ret.first; it!=ret.second; ++it)
          std::cout << ' ' << it->second;
        std::cout << '
    ';
      }
    
      return 0;
    }
    

    输出

    mymm contains:
    a => 10
    b => 20 30 40
    c => 50 60
    d => 60
    
  • 相关阅读:
    iNeuOS工业互联网系统,一键部署,5分钟内开箱即用
    演讲的要义
    在MyBatis中实现动态表名
    Pandora Boot和Spring Boot
    java对象克隆以及深拷贝和浅拷贝
    超级快的端口扫描工具blackwater
    webgl智慧楼宇发光系列之线性采样下高斯模糊
    canvas可视化效果之内阴影效果
    图表绘制之RepeatNode的妙用
    【ECUG】十四年如一日,有这样一群初心不改的技术人
  • 原文地址:https://www.cnblogs.com/qiqiloved/p/10075362.html
Copyright © 2011-2022 走看看