zoukankan      html  css  js  c++  java
  • [Aizu] ITP2_8_D: Multi-Map

    前言

    ITP系列的题目, 只是为了了解基础的用法的, 所以为了提高效率, 不再记录完整的内容, 只侧重于本题中所使用到的一些知识

    题目

    传送门: ITP2_8_D: Multi-Map

    求解

    用法

    multimap与map几乎相同, 不过区别在于, multimap一个键值可以对应多个值, 而map一个键只会对应一个值
    find()方法和map有区别, multimap的find()方法会在所有满足条件的元素中随机返回一个指向该元素的迭代器
    看方法的说明里面lower_bound()方法只是返回一个指向第一个不小于键的元素的迭代器, 实际使用的时候似乎跟插入的顺序有关系. 通过lower_bound()与upper_bound()可以遍历所有的键对应的元素, 而且是按照插入顺序遍历的.
    关于multimap的常用方法参见之前的map常用方法(同样只针对于本题目),直接搬过来了

    方法名 描述 示例
    insert((key, val)) 向multimap中插入元素(key, val) my_map.insert(make_pair(key, val));
    erase(key) 删除含有key的元素 my_map.erase(key);
    find(key) 搜索与key一致的元素, 并返回指向该元素的迭代器, 如果存在多个元素则随机返回一个, 如果不存在, 则返回指向末尾的迭代器end() map<string, int>::iterator it = my_map.find(key);
    lower_bound(key) 返回指向第一个不小于key的元素的迭代器 it1 = my_map.lower_bound(key);
    upper_bound(key) 返回指向第一个大于key的元素的迭代器 it2 = my_map.upper_bound(key);
    count(key) 返回与key键匹配的元素数 if (my_map.count(key)) {...}
    equal_range(key) 返回容器中所拥有给定键的元素范围, 范围以两个迭代器定义. pair<multimap<string, int>::iterator, multimap<string, int>::iterator> range = my_map.equal_range(key);

    编码

    自己尝试使用STL的代码

    #include <bits/stdc++.h>
    using namespace std;
    
    int main(void) {
    	ios::sync_with_stdio(false);
    	cin.tie(0);
    
    	int q, com, x;
    	string key, L, R;
    	multimap<string, int> my_map;
    	multimap<string, int>::iterator it1, it2, it;
    
    	cin >> q;
    	while (q--) {
    		cin >> com >> key;
    		switch (com) {
    			case 0:
    				cin >> x;
    				my_map.insert(make_pair(key, x));
    				break;
    			case 1:
    				it1 = my_map.lower_bound(key);
    				it2 = my_map.upper_bound(key);
    				for (it = it1; it != it2; it++) {
    					cout << it->second << endl;
    				}
    				break;
    			case 2:
    				my_map.erase(key);
    				break;
    			case 3:
    				L = key;
    				cin >> R;
    				it1 = my_map.lower_bound(L);
    				it2 = my_map.upper_bound(R);
    				for (it = it1; it != it2; it++) {
    					cout << it->first << " " << it->second << endl;
    				}
    				break;
    		}
    	}
    }
    

    别人使用STL的代码

    传送门: #3431207 Solution for ITP2_8_D by shioree

    #include <bits/stdc++.h>
    using namespace std;
     
    int main() {
      int num_query; cin >> num_query;
      multimap<string, int> dic;
       
      while (num_query--) {
        int command; scanf("%d", &command);
        char key[20]; scanf("%s", key);
         
        switch (command) {
          case 0:
            int value; scanf("%d", &value);
            dic.insert(make_pair(key, value));
            break;
             
          case 1:
            {
              pair<multimap<string, int>::iterator, multimap<string, int>::iterator> 
                range = dic.equal_range(key);
              while (range.first != range.second) {
                printf("%d
    ", range.first -> second);
                range.first++;
              }
              break;
            }
             
          case 2:
            dic.erase(key);
            break;
             
          case 3:
            char key2[20]; scanf("%s", key2);
            multimap<string, int>::iterator it = dic.lower_bound(key);
            multimap<string, int>::iterator last = dic.upper_bound(key2);
            while (it != last) {
              printf("%s %d
    ", ((*it).first).c_str(), (*it).second);
              it++;
            }
            break;
        }
      }
    }
    

    记录

    对于相同键的元素存在方法equal_range() 描述如下:
    Returns a range containing all elements with the given key in the container. The range is defined by two iterators, one pointing to the first element that is not less than key and another pointing to the first element greater than key. Alternatively, the first iterator may be obtained with lower_bound(), and the second with upper_bound().
    返回容器中所有拥有给定关键的元素范围。范围以二个迭代器定义,一个指向首个不小于 key 的元素,另一个指向首个大于 key 的元素。首个迭代器可以换用 lower_bound() 获得,而第二迭代器可换用 upper_bound() 获得。

  • 相关阅读:
    内核态和用户态的区别
    【Docker官方文档】理解Docker
    dpdk中kni模块
    linux的deamon后台运行
    在C语言中如何嵌入python脚本
    Docker学习之路(三)Docker网络详解
    Docker学习之路(二)DockerFile详解
    fopencookie函数详解
    Docker学习之路(一)
    C/C++代码覆盖率工具gcov、lcov
  • 原文地址:https://www.cnblogs.com/by-sknight/p/11005657.html
Copyright © 2011-2022 走看看