欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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甲级真题