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