zoukankan      html  css  js  c++  java
  • C++ multimap的用法

    定义

    类似于map,multimap也是存储两个元素之间的映射关系的容器,不相同的是,multimap的key值可以重复出现。另外和map、set一样,multimap的关键字类型也要具有严格弱序的定义。(补:通常不对关联容器使用泛型算法--<<C++ Primer>>)

    初始化

    • 创建空的容器:

      std::multimap<char, int> first;

    • 从一个范围构造:

      std::multimap<char, int> second(first.begin(), first.end());

    • 复制构造:

      std::multimap<char, int> third(second);

    • 添加自定义比较:

      struct classcomp {
          bool operator() (const char& lhs, const char& rhs) const{
              return lhs<rhs;
          }
      };
      
      std::multimap<char,int,classcomp> fourth;
      

    添加元素

    添加元素使用成员函数insert,有以下几种添加元素的形式:

    std::multimap<char, int> mymultimap

    • 版本一:添加单个元素

      mymultimap.insert(std::pair<char, int>('a', 100));
      mymultimap.insert({'b', 20});
      //insert()返回指向当前新插入元素的迭代器
      it = mymultimap.insert(std::pair<char, int>('c', 60));
      
    • 版本二:从一个范围添加

      std::multimap<char, int> hismultimap;
      hismultimap.insert(mymultimap.begin(), mymultimap.find('c'));
      
    • 版本三:在提示的(Hint)位置添加:

      mymultimap.insert(it, std::pair<char, int>('d', 10));
      

    访问操作

    • 遍历:

      mymultimap.insert (std::pair<char,int>('a',10));
      mymultimap.insert (std::pair<char,int>('b',20));
      mymultimap.insert (std::pair<char,int>('b',150));
      
      for(std::mymultimap<char, int>::iterator it = mymultimap.begin(); it != mymultimap.end(); ++it)
          std::cout << (*it).first << "=>" << (*it).second << "
      "
      
      //  output:
      //  a=>10
      //  b=>20;
      //  b=>150;  
      
    • 查找:

      • 方法一:利用成员函数findcount

        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));
        
        auto nums = mymm.count('z'); //'z'的数量
        auto iter = mymm.find('z');  //第一个'z'
        while(nums--){
           cout << iter->second << endl;
           iter++;
        }
        
      • 方法二:利用成员函数lower_boundupper_bound

        这两个函数都接受一个查找关键字,返回一个迭代器lower_bound返回的迭代器指向第一个具有给定关键字的元素,upper_bound返回的迭代器指向最后一个匹配给定关键字的元素之后的位置。如果查找元素不存在,两个函数返回的迭代器相等--指向一个不影响排序的关键字插入位置。

        for(auto beg = mymm.lower_bound('z'), end = mymm.upper_bound('z'); beg != end; ++beg)
            cout << beg->second << endl;
        
      • 方法三:使用成员函数equal_range

        euqal_range接受一个查找关键字,返回一个迭代器pair。若关键字存在,则第一个迭代器指向第一个与关键字匹配的元素,第二个迭代器指向最后一个匹配元素之后的位置。若未找到匹配元素,则两个迭代器都指向关键字可以插入的位置。

        for(auto pos = mymm.equal_range('z'); pos.first != pos.second; ++pos.first)
            cout << pos.first->second << endl;
        

    删除元素

    使用erase删除multimap中的元素,erase有三种形式:

    • 删除指定键值:mymm.erase('a'),返回删除的元素数量

    • 传入一个迭代器:

      it = mymm.find('a');
      mymm.erase(it);
      
    • 传入两个迭代器,删除一定范围元素

      mymm.erase(it, mymm.end());
      
  • 相关阅读:
    #最小生成树,Trie#CF888G Xor-MST
    #Tarjan#洛谷 5676 [GZOI2017]小z玩游戏
    #区间dp#CF1114D Flood Fill
    #构造,二分#[AGC006B] [AGC006D] Median Pyramid
    #0/1分数规划#AT1807 食塩水
    #笛卡尔树#洛谷 3793 由乃救爷爷
    #同余最短路#洛谷 2371 [国家集训队]墨墨的等式
    awk命令使用
    k8s快速删除所有退出的pod
    ratticdb密码管理工具安装使用
  • 原文地址:https://www.cnblogs.com/patrolli/p/11281736.html
Copyright © 2011-2022 走看看