patrolli

定义

类似于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());
    

分类:

技术点:

相关文章:

  • 2021-09-25
  • 2021-08-08
  • 2021-08-14
  • 2021-11-03
  • 2019-01-09
  • 2021-11-17
  • 2021-12-09
  • 2021-12-19
猜你喜欢
  • 2021-09-21
  • 2021-05-15
  • 2021-08-28
  • 2018-04-20
  • 2021-01-26
  • 2021-09-04
  • 2021-11-29
相关资源
相似解决方案