PAT甲级 1022 Digital Library (暨 set、map总结)

    技术2022-07-11  93

    一、map总结 1、头文件:#include <map>

    2、定义一个map类型的变量: map<int,string>mp;其中,mp的key为int类型,val为string类型;map不限制其键值的数据类型,可以设为其他任何类型;

    3、插入元素:

    //定义一个map: map<int,string> mpi; mpi.insert(pair<int,string>(0,"zero");//法一:insert插入pair mpi.insert(map<int,string>::value_type(0,"zero");//法二:insert插入value_type mpi[1]="one";//法三:array方式插入 //定义另种类型的map: map<string,set<int>> mps; string str1="weekday",str2="weekends"; set<int> day;day.insert(6);day.insert(7); mps[str1].insert(1);//由于val为set类型,所以插入set中单个元素时用的是set类型的insert mps[str1].insert(2); mps[str2]=day;//当val为set型变量时,可直接赋值;

    注: 1)上述法一和法二要求所插入的key尚不存在于map中;若map中包含了所要插入的key,则insert操作是无法在插入数据的; 2)使用法三时,若当前map已包含了所要插入的key,则法三的操作会覆盖掉之前的val; 3)map中的key-val本是一一对应的,但如果将val设为set类型或vector类型,则可实现一对多的映射,在插入键值时的方法,也略有不同(见上例);

    4、查找元素:

    map<string,int> mp; // find 按key查找val,返回迭代器指向当前查找元素的位置,未找到则返回map::end()位置 map<string,int>::iterator it=mp.find("123"); if(it != mapStudent.end()) cout<<"Find, the value is"<<it->second<<endl; else cout<<"Do not Find"<<endl;

    5、删除元素:mp.erase("123"); 按key删除,若成功删除则返回1,否则返回0;

    6、清空map:mp.clear();

    7、map的大小:int msize=mp.size();,返回当前map中存储的元素(键值对)个数

    8、map的其他基本操作函数:

    begin() 返回指向map头部的迭代器 count() 返回指定元素出现的次数 empty() 如果map为空则返回true end() 返回指向map末尾的迭代器 max_size() 返回可以容纳的最大元素个数 rbegin() 返回一个指向map尾部的逆向迭代器 rend() 返回一个指向map头部的逆向迭代器 swap() 交换两个map upper_bound() 返回键值>给定元素的第一个位置

    二、set总结 1、特点总结: set是一个可以自动排序的集合(无重复元素) 2、头文件:#include <set> 3、常用方法与map很类似:

    insert(i) 插入元素i erase(i) 删除元素i begin() 返回set容器第一个元素的迭代器 end()     返回一个指向当前set末尾元素的下一位置的迭代器. clear()   删除set容器中的所有的元素 empty()    判断set容器是否为空 max_size()   返回set容器可能包含的元素最大个数 size()     返回当前set容器中的元素个数 rbegin()   返回的值和end()相同 rend()    返回的值和begin()相同

    三、题解

    #include <iostream> #include <set> #include <map> #include <string> using namespace std; map<string, set<int>> title, author, keywords, publisher, year; void query(map<string, set<int>>& m, string& s) { if (m.find(s) != m.end()) { //auto为c++中让编译器识别元素类型,同时注意如何遍历set中的元素 for (auto it = m[s].begin(); it != m[s].end(); it++) printf("d\n", *it); } else printf("Not Found\n"); } int main() { int n, m, id, num; string tit, aut, key, pub, yr, qurstr; scanf("%d", &n); for (int i = 0; i < n; i++) { scanf("%d\n", &id);//这个换行读入很重要,否则下面那个getline就会出错 getline(cin, tit); title[tit].insert(id); getline(cin, aut); author[aut].insert(id); while (cin >> key) {//这种读入方法!! keywords[key].insert(id); char c = getchar(); if (c == '\n') break; } getline(cin, pub); publisher[pub].insert(id); getline(cin, yr); year[yr].insert(id); } scanf("%d", &m); for (int i = 0; i < m; i++) { scanf("%d: ", &num); getline(cin, qurstr); cout << num << ": " << qurstr<<'\n'; switch (num) { case 1:query(title, qurstr); break; case 2:query(author, qurstr); break; case 3:query(keywords, qurstr); break; case 4:query(publisher, qurstr); break; case 5:query(year, qurstr); break; } } }
    Processed: 0.010, SQL: 9