思路如下:
比如我用户输入一个用 "Yue Chen" 来搜索,可以找到 id 为 "1111111" 和 "3333333" 两本书,那实际上就是映射了,而且是一个对应多个的映射,自然就想到了用从 string 到 vector<string> 的映射了
基于这个思路,我又是这样展开想的:
/* 伪码 */ 1. 输入:将输入的用户搜索词 L2 ~ L6 全部当成键,其值为 L1 2. 输出:从 map 中取出值加入到 vector<string>,因为要排序
对于第一点,输入:
cin >> L1; for (对其余 L2 ~ L6 每行,记为 Lx) { cin >> Lx; if (键 Lx 不在 map) { vector<string> v; v.push_back(L1); map[Lx] = v; } else { vecotr<string> v; map<string, vector<string> >::iterator mi; mi = map.find(Lx); v = mi->second; v.push_back(L1); map[Lx] = v; } }
对于第二点,输出:
for (遍历用户输入所有搜索词) { //如 "2: Yue Chen" 首先要去除前面 3 位序号,获得关键字 int len = 0; for (; len < 用户搜索词.size(); ++len); str = 用户搜索词.substr(3, len); //用这个关键字查找映射 if (map.find(关键字) != map.end()) { map<string, vector<string> >::iterator mi; mi = map.find(关键字); sort(mi->second.begin(), mi->second.end());//按增序排序 for (对每个 mi->second 元素) cout << 元素 << endl; } else cout << "Not Found" << endl; }
当然,有些细节还是要注意的,比如对用户输入 L4 的处理——每个关键字都需要被添加入 map。但主要思路就是这两部分
另外,也记录下我刷题过程中遇到的小问题:
1. cin >> 与 getline() 同时使用的问题,前者遇到回车、空格或制表符会停止而且这些终止符会被留在缓冲区;后者只遇回车停止而且回车会被取走忽略。所以一个 cin >> 要对应一个 cin.ignore(); 以删除终止符,否则 cin >> 之后使用 getline(); 是得不到正确输入的