一、解答
#include <iostream>
#include <stdio.h>
#include <vector>
#include <set>
#include <string>
using namespace std;
void split_string(string key_words_string,int i);
struct book
{
int id;
string titie;
string author;
vector<string> key_words;
string publisher;
int pub_year;
};
typedef struct book book;
vector<book> b;
set<string> titie_set;
set<string> author_set;
set<string> key_words_set;
set<string> publisher_set;
int main()
{
int book_num;
cin>>book_num;
b.resize(book_num);
for(int i=0;i<book_num;i++){
cin>>b[i].id;
string str="\n";
getline(cin,str);
getline(cin,b[i].titie);
titie_set.insert(b[i].titie);
getline(cin,b[i].author);
author_set.insert(b[i].author);
string key_words_string;
getline(cin,key_words_string);
split_string(key_words_string,i);
getline(cin,b[i].publisher);
publisher_set.insert(b[i].publisher);
cin>>b[i].pub_year;
}
int q_num=0;
cin>>q_num;
string str="\n";
getline(cin,str);
for(int i=0;i<q_num;i++){
string query;
getline(cin,query);
string query_deal;
int n=0;
n=query.find(" ");
query_deal=query.substr(n+1,query.size()-n);
cout<<query<<endl;
int is_num=1;
for(int j=0;j<query_deal.length();j++){
if(query_deal[j]<'0'||query_deal[j]>'9'){
is_num=0;
break;
}
}
set<int> result;
if(is_num==1){
int year;
sscanf(query_deal.c_str(),"%d",&year);
for(int j=0;j<book_num;j++){
if(b[j].pub_year==year){
result.insert(b[j].id);
}
}
if(result.empty()){
cout<<"Not Found"<<endl;
}
}else{
if(titie_set.find(query_deal)!=titie_set.end()){
for(int j=0;j<book_num;j++){
if(b[j].titie==query_deal){
result.insert(b[j].id);
}
}
}else if(author_set.find(query_deal)!=author_set.end()){
for(int j=0;j<book_num;j++){
if(b[j].author==query_deal){
result.insert(b[j].id);
}
}
}else if(key_words_set.find(query_deal)!=key_words_set.end()){
for(int j=0;j<book_num;j++){
for(int k=0;k<b[j].key_words.size();k++){
if(b[j].key_words[k]==query_deal){
result.insert(b[j].id);
break;
}
}
}
}else if(publisher_set.find(query_deal)!=publisher_set.end()){
for(int j=0;j<book_num;j++){
if(b[j].publisher==query_deal){
result.insert(b[j].id);
}
}
}else{
cout<<"Not Found"<<endl;
}
}
for(auto it=result.begin();it!=result.end();it++){
printf("%07d\n",*it);
}
}
}
void split_string(string key_words_string,int i)
{
int n=0;
while(key_words_string.find(" ")!=key_words_string.npos){
n=key_words_string.find(" ");
string word=key_words_string.substr(0,n);
b[i].key_words.push_back(word);
key_words_set.insert(word);
key_words_string=key_words_string.substr(n+1);
}
b[i].key_words.push_back(key_words_string);
key_words_set.insert(key_words_string);
return;
}
二,值得记录的知识点
(一)关于vector的使用
1. 为了减少传参导致的耗时,vector尽量设为全局变量。
1. vector设为未知大小的全局变量后,可以通过 变量名.resize(size) 改变大小。
b.resize(book_num);
(二)关于set的使用
1. 关于插入元素(使用方法):
result.insert(b[j].id);
2. 关于查找元素(使用方法):
if(titie_set.find(query_deal)!=titie_set.end()){
. . . . . .
}
(1)参数:查找内容
(1)返回值:找到返回定位器it(假设已有auto it),*it 为内容 ; 找不到返回变量名.end() 。
3. 关于遍历元素:
for(auto it=result.begin();it!=result.end();it++){
printf("%07d\n",*it);
}
(三)关于输入
1. 如果主要考算法知识,输入比较简单的,可以直接用cin 。
2. 如果输入格式固定,且各部分需要划分,可使用scanf(“格式串”,变量,变量 . . .)进行输入 。
3. 如果需要“仅”使用换行作为分隔符,可以使用getline(cin,变量),同时有些注意事项:
(1)头文件:#include <stdio.h>
(1)在cin后使用,需要加上以下代码清除缓存
string str="\n";
getline(cin,str);
(三)关于string
1. 在结构体中不可初始化 。
2. 获取长度(使用方法):
query_deal.length()
3. 查找字符(使用方法):
key_words_string.find(" ")
(1)参数:字符
(1)返回值:找到返回下标, 找不到返回 变量名.npos (敲重点)。
4. 截取字符串(使用方法):
string word=key_words_string.substr(0,n);
(1)参数:( 截取起点 pos,截取长度 len ),第一个默认值 pos= 0,第二个默认值 string.length() - pos ,即截到结尾。第二个使用默认值时,请不要多加逗号 。
(1)返回值:新字符串。
5. 关于遍历:
无需使用迭代器,直接使用length()获取长度,s[i]读取就好
for(int j=0;j<query_deal.length();j++){
if(query_deal[j]<'0'||query_deal[j]>'9'){
is_num=0;
break;
}
}
6. string 转 int:
头文件:
#include <stdio.h>
应用:
sscanf(query_deal.c_str(),"%d",&year);
拓展:int 转 string
string i;
int a=1;
i=to_string(a);
萌新写文,如有不足,还望指正!