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 << "\n"
    
    //  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());
    
posted @ 2019-08-01 12:22  patrolli  阅读(7095)  评论(0编辑  收藏  举报