multimap的一key对应多value的排序(Borrowers UVA - 230)

multimap 能接受一key对应多value的情况
multimap 会自动按key值排序,而value则按输入顺序排序,要想把一个key对应的多个value排序
必须自己构造排序函数
typedef pair PAIR;
bool cmp_by_value(const PAIR& lhs, const PAIR& rhs) {
    if(lhs.first==rhs.first)
        return lhs.second    else return lhs.first

}//这个挺重点的

///

本渣渣的想法是 :

先提取出输入的书名人名,利用了 substr 以及 find(借鉴了网上大佬的)

然后先按照人名排序 ,在把 人名 相同的按照 署名排序 ,用到了上述构造的排序函数(大家可以参考网上大佬的教学)

网址:https://blog.csdn.net/yutianxin123/article/details/52454252

上面都是基础的没基础有思路也做不动233

晚上上述任务后,再进行二次输入,我的做法先把原数组复制一遍,borrow删除原数组 元素后成为数组s1,return创建新数组s2

shelves归还,每次归还换一本s2消除一个元素,s1添加一个元素,同时对s1进行  再排序 防止s1相同key值 顺序错了,就这样子,代码这么冗长都是因为在排序问题,毕竟要进行输入再到vector再到排序再到重新赋值,这法用了7次每次7行....,如果有人能优化一下,请反馈一下,谢谢.还有网上方法比我的简单.

#include
using namespace std;
typedef pair PAIR;
bool cmp_by_value(const PAIR& lhs, const PAIR& rhs) {
    if(lhs.first==rhs.first)
        return lhs.second    else return lhs.first}
int main()
{
    int  zz;
    string s,k;
    multimapb;
    multimapbc;
    multimapkk;
    while(getline(cin,s))
    {
        if(s=="END")
        {
            break;
        }
        else
        {
            string x,y;
            x=s.substr(0,s.find_last_of("\"")+1);
            y=s.substr(s.find_last_of("\"")+5);
            b.insert(make_pair(y,x));
        }
    }
    vector bz(b.begin(), b.end());
    sort(bz.begin(), bz.end(), cmp_by_value);
    b.clear();kk.clear();
    for (int i = 0; i != bz.size(); ++i)
    {
         b.insert(bz[i]);
         kk.insert(bz[i]);
    }
    while(getline(cin,k))
    {
        if(k=="END")
        {
            break;
        }
        else if(k=="SHELVE")
        {
           map::iterator l;
            for(l=bc.begin();l!=bc.end();l++)
            {
                    if(kk.empty())
                    {
                        cout<<"Put "<second<<" first"<                        kk.insert(*l);
                        vector zzz(kk.begin(), kk.end());
                        sort(zzz.begin(), zzz.end(), cmp_by_value);
                        kk.clear();
                        for (int i = 0; i != zzz.size(); ++i)
                        {
                            kk.insert(zzz[i]);
                        }
                    }
                    else
                    {
                        map::iterator aa=kk.begin();
                        if((l->first)<(aa->first))
                        {
                            cout<<"Put "<second<<" first"<                            kk.insert(*l);
                            vector yy(kk.begin(), kk.end());
                            sort(yy.begin(), yy.end(), cmp_by_value);
                            kk.clear();
                            for (int i = 0; i != yy.size(); ++i)
                            {
                                    kk.insert(yy[i]);
                            }
                        }
                        else  if((l->first)>=(aa->first))
                        {
                            int jj=0;
                            map::iterator tt;
                            tt=l;
                            map::iterator ss;
                            for(ss=kk.begin();ss!=kk.end();ss++)
                            {
                              if((ss->first)>(tt->first))
                              {
                                  jj++;
                                  map::iterator y1;
                                  y1=ss;
                                  y1--;
                                  cout<<"Put "<second<<" after "<second<                                  kk.insert(*l);
                                 vector zz(kk.begin(), kk.end());
                                  sort(zz.begin(), zz.end(), cmp_by_value);
                                  kk.clear();
                                  for (int i = 0; i != zz.size(); ++i)
                                 {
                                    kk.insert(zz[i]);
                                  }
                                  break;
                               }
                               else  if((ss->first)==(tt->first))
                              {
                                  jj++;
                                  if(ss->second>tt->second)
                                  {
                                  map::iterator y1;
                                  y1=ss;
                                  y1--;
                                  cout<<"Put "<second<<" after "<second<                                  kk.insert(*l);
                                 vector zz(kk.begin(), kk.end());
                                  sort(zz.begin(), zz.end(), cmp_by_value);
                                  kk.clear();
                                  for (int i = 0; i != zz.size(); ++i)
                                 {
                                    kk.insert(zz[i]);
                                  }
                                  break;
                                  }
                               }
                            }
                            if(jj==0)
                                  {
                                      map::iterator yy1=kk.end();
                                      yy1--;
                                      cout<<"Put "<second<<" after "<second<                                      kk.insert(*tt);
                                       vector zaz(kk.begin(), kk.end());
                                  sort(zaz.begin(), zaz.end(), cmp_by_value);
                                  kk.clear();
                                  for (int i = 0; i != zaz.size(); ++i)
                                 {
                                    kk.insert(zaz[i]);
                                  }
                                  }
                        }
                    }
            }
            bc.clear();
            cout<<"END"<        }
        else
        {
           string m,nn;
           m=k.substr(0,k.find_first_of("\"")-1);
           nn=k.substr(k.find_first_of("\""));
           if(m=="BORROW")
           {
               map::iterator ll;
               for(ll=kk.begin();ll!=kk.end();ll++)
                {
                    if((ll->second)==nn)
                    {
                        kk.erase(ll++);
                        if(kk.empty())
                        {
                            break;
                        }
                    }
                }
            }
           else if(m=="RETURN")
           {
               map::iterator lv;
               for(lv=b.begin();lv!=b.end();lv++)
                {
                    if((lv->second)==nn)
                    {
                        bc.insert(*lv);
                    }
                }
                vector xx(bc.begin(), bc.end());
                sort(xx.begin(), xx.end(), cmp_by_value);
                bc.clear();
                for (int i = 0; i != xx.size(); ++i)
                {
                  bc.insert(xx[i]);
                }
            }
        }


    }
    return 0;
}

你可能感兴趣的:(multimap的一key对应多value的排序(Borrowers UVA - 230))