A1022 Digital Library (30分)

思路如下

比如我用户输入一个用 "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(); 是得不到正确输入的

 

点击跳转至完整代码

 
posted @ 2021-02-01 22:22  幼麟  阅读(44)  评论(0编辑  收藏  举报