PAT甲级 1022 Digital Library (暨 set、map总结)
程序员文章站
2024-02-17 12:51:10
...
一、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("%07d\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;
}
}
}
推荐阅读
-
【PAT甲级 映射】1022 Digital Library (30 分)
-
PAT甲级 1022 Digital Library (暨 set、map总结)
-
PAT 甲级 1022 Digital Library
-
PAT 甲级 1022 Digital Library
-
PAT甲级-1022-Digital Library(map映射+倒排索引)
-
PAT甲级 1022 Digital Library
-
【PAT甲级】1022 Digital Library (30)(map)
-
PAT甲级1022(Digital Library)
-
pat 甲级 1022 Digital Library
-
PAT甲级 1022 Digital Library (30) map映射,set