面试之快速学习STL-multimap

本文介绍了C++STL中的multimap容器,它用于存储键值对,允许多个键相同且自动排序。与map不同,multimap不支持at()和[]操作,而是提供了count、遍历、find、lower_bound、upper_bound和equal_range等方法来处理多键情况。
摘要由CSDN通过智能技术生成

multimap

  1. multimap 容器也用于存储 pair<const K, T> 类型的键值对(其中 K 表示键的类型,T 表示值的类型)
  2. 其中各个键值对的键不能做修改;该容器也会自行根据键的大小对存储的所有键值对做排序操作。
  3. 和 map 容器的区别在于,multimap 容器中可以同时存储多(≥2)个键相同的键值对。
//,使用此方式初始化 multimap 容器时,其底层会先将每一个{key, value}创建成 pair 类型的键值对,然后再用已建好的各个键值对初始化 multimap 容器。
std::multimap<std::string, std::string> map1{
{"k1","v1"},
{"k2","v2"},
{"k3","v3"},
};

//借助 pair 类模板的构造函数来生成各个pair类型的键值对
multimap<string, string>mymultimap{
    pair<string,string>{"C语言教程", "http://c.biancheng.net/c/"},
    pair<string,string>{ "Python教程", "http://c.biancheng.net/python/"},
    pair<string,string>{ "STL教程", "http://c.biancheng.net/stl/"}
};
//调用 make_pair() 函数,生成键值对元素
//创建并初始化 multimap 容器
multimap<string, string>mymultimap{
    make_pair("C语言教程", "http://c.biancheng.net/c/"),
    make_pair("Python教程", "http://c.biancheng.net/python/"),
    make_pair("STL教程", "http://c.biancheng.net/stl/")
};

//拷贝
multimap<string, string>newmultimap(mymultimap);

multimap模版参数

  1. multimap 类模板共可以接收 4 个参数,其中第 3 个参数可用来修改 multimap 容器内部的排序规则
template < class Key,                                   // 指定键(key)的类型
           class T,                                     // 指定值(value)的类型
           class Compare = less<Key>,                   // 指定排序规则
           class Alloc = allocator<pair<const Key,T> >  // 指定分配器对象的类型
           > class multimap;
  1. 如下面进行降序操作,默认是升序
std::multimap<char, int, std::greater<char>> map3{
{'a', 1},
{'b', 2}
}

//默认是std::less<char>

注意

  1. 和 map 容器相比,multimap 未提供 at() 成员方法,也没有重载 [] 运算符。这意味着,map 容器中通过指定键获取指定指定键值对的方式,将不再适用于 multimap 容器。其实这很好理解,因为 multimap 容器中指定的键可能对应多个键值对,而不再是 1 个
std::multimap<char, int> map1{
        {'c', 10},
        {'b', 20},
        {'b', 15},
        {'a', 30}
    };
    //1. count
    std::cout<< "map1.count('b') = " << map1.count('b') << std::endl;
    //map1.count('b') = 2
    
    //2. 遍历
    for (auto it = map1.begin(); it != map1.end(); ++it) {
        std::cout << it->first << " "<< it->second << std::endl;
    }
    /*
     a 30
     b 20
     b 15
     c 10
     */
    //3. find
    auto it1 = map1.find('b');
    std::cout << it1->first << " "<< it1->second << std::endl;
    //b 20
    
    //4. lower/upper_bound
    auto it2 = map1.upper_bound('b');
    std::cout << it2->first << " "<< it2->second << std::endl;
    //c 10
    
    auto it3 = map1.lower_bound('b');
    std::cout << it3->first << " "<< it3->second << std::endl;
    //b 20
    
    //5.equal_range
    auto p1 = map1.equal_range('b');
    for (auto it = p1.first; it != p1.second; ++it) {
        std::cout << it->first << " "<< it->second << std::endl;
    }
    /*
     b 20
     b 15
     */

说明

  1. find(key), 在 multimap 容器中查找首个键为 key 的键值对,如果成功找到,则返回指向该键值对的双向迭代器;反之,则返回和 end() 方法一样的迭代器。
  2. lower_bound(key) 返回一个指向当前 multimap 容器中第一个大于或等于 key 的键值对的双向迭代器。如果 multimap 容器用 const 限定,则该方法返回的是 const 类型的双向迭代器。
  3. upper_bound(key) 返回一个指向当前 multimap 容器中第一个大于 key 的键值对的迭代器。
  4. equal_range(key) 该方法返回一个 pair 对象(包含 2 个双向迭代器),其中 pair.first 和 lower_bound() 方法的返回值等价,pair.second 和 upper_bound() 方法的返回值等价。也就是说,该方法将返回一个范围,该范围中包含的键为 key 的键值对。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值