面试之快速学习STL-multimap

multimap

  1. multimap 容器也用于存储 pair 类型的键值对(其中 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

注意

  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 的键值对。

你可能感兴趣的:(面试之快速学习STL,学习,c++,开发语言)