PAT甲級 1022 Digital Library (暨 set、map總結)

一、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;
		}

	}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章