運用了一些功能強大的函式
在此作個簡介
set : 集合,不會包含相同元素的集合
map : 可作一對一映射,兩者的資料型態可以不同
multimap : 可作一對多的映射
本題的作法,因為multimap在建立之時,就已經以前者元素作排序
getline讀入的一行也因為先後順序不同,在插入map時也排序好了
所以在map建立後直接輸出即可
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <cctype>
#include <set>
#include <map>
using namespace std;
int main(){
freopen("input.txt", "r", stdin);
set<string> igwords;
set<string>::iterator it;
string input;
while(1){ //insert ignore words into igwords set
cin >> input;
if(input=="::")break;
else {
igwords.insert(input);
input.erase();
}
}
string title;
multimap<string,string> titles;
map<string,string>::iterator it_map =titles.begin();
while(getline(cin,input)){ //getline(input_stream,destination_string)
title.erase();
for(int i=0;i<=input.size();i++)input[i] = tolower(input[i]);
for(int i=0;i<=input.size();i++){
if(!isalpha(input[i])){
if(igwords.count(title)==0 && isalpha(title[0])){ //如果和igwords都不相符
string input_tmp = input; //開始將input中的單字轉為大寫存入input_tmp
int tmp = i - title.length(); //
for(int k = tmp; k < tmp+title.length(); k++) input_tmp[k]=toupper(input[k]);
titles.insert(it_map,pair<string,string>(title,input_tmp)); //存入titles中
}
title.erase();
continue;
}
title+=input[i];
}
input.erase();
}
//print set
// for(it=igwords.begin();it!=igwords.end();it++)cout << *it << '\n';
// cout << "\n";
for(it_map=titles.begin();it_map!=titles.end();it_map++)cout << it_map->second << '\n';
return 0;
}
沒有留言:
發佈留言