5月18日学习总结

上节课老师教授了两种方式解决删除vector中数据排序混乱问题,下面是通过虚删的方式重新写的代码。这种方式适合数据类中有很多中数据的情况,用multimap时存vector中的下标,但是像这种通讯录只有姓名和电话号码的类,直接用的multimap就行了。

#include<bits/stdc++.h>
using namespace std;
class student
{
    string names,tel;
    int cunzai=1;//这个就是处理虚删的关键,初始为1表示存在,删除后置为0,表示已删除。
public:
    student(){}
    student(string n,string t,int c):names(n),tel(t),cunzai(c){}
    string getnames(){return names;}
    string gettel(){return tel;}
    int getcun(){return cunzai;}
    void xiugaite(string b)
    {
        tel=b;
    }
        void xiugaina(string s)
    {
        names=s;
    }
    void xiugaicun()
    {
        cunzai=0;
    }
    friend ostream& operator<<(ostream& os,const student& c);
    friend istream& operator>>(istream& is,student& c);
};
ostream& operator<<(ostream& os,const student& c)
{
    os<<c.names<<"\t"<<c.tel;
}
istream& operator>>(istream& is,student& c)
{
    int l;
    is>>c.names;
    while(1)
    {
        is>>c.tel;
        l=c.tel.size();
        if(l==11)
        break;
    }
}
struct setstudent
{
    vector<student>all;
    multimap<string,int>al;
    multimap<string,int>alll;
public:
    void addstudent();
    void fixstudent();
    void cutstudent();
    void chazhao();
    void readstudent();
    void writestudent();
};
void setstudent::readstudent()
{
    ifstream in;
    in.open("C:\\GameDownload\\student.txt");
    while(!in.eof())
    {
        string one;
        string telll,namess;
        int cunz=1;
        getline(in,one);
        if(one.empty())
        continue;
        istringstream is(one);
        is>>namess;
        is>>telll;
        al.insert(make_pair(namess,all.size()));
        alll.insert(make_pair(telll,all.size()));
        student two(namess,telll,cunz);
        all.push_back(two);
    }
    in.close();
}
void setstudent::writestudent()
{
    ofstream out;
    out.open("C:\\GameDownload\\student.txt");
    for(auto it7=all.begin();it7!=all.end();it7++)
    {
        if((*it7).getcun()==1)
        out<<(*it7)<<endl;
    }
    out.close();
}
void setstudent::addstudent()
{
    student me;
    cin>>me;
    all.push_back(me);
    al.insert(make_pair(me.getnames(),all.size()-1));
    alll.insert(make_pair(me.gettel(),all.size()-1));
}
void setstudent::chazhao()
{
    string renming;
    cin>>renming;
    multimap<string,int>::iterator it1;
    multimap<string,int>::iterator it2;
    it1=al.lower_bound(renming);
    it2=alll.lower_bound(renming);
    if(it1!=al.end())
    {
        for(;it1!=al.upper_bound(renming);it1++)
        {
            if(all[it1->second].getcun())
            cout<<all[it1->second]<<endl;
        }
    }
    if(it2!=alll.end())
    {
        for(;it2!=alll.upper_bound(renming);it2++)
        {
            if(all[it2->second].getcun())
            cout<<all[it2->second]<<endl;
        }
    }
}
void setstudent::fixstudent()
{
    string renming;
    cin>>renming;
    multimap<string,int>::iterator it1;
    multimap<string,int>::iterator it2;
    it1=al.find(renming);
    it2=alll.find(renming);
    if(it1!=al.end())
    {
        string newte;
        cin>>newte;
        string oldte=all[it1->second].gettel();
        all[it1->second].xiugaite(newte);
        alll.erase(oldte);
        alll.insert(make_pair(newte,it1->second));
    }
    if(it2!=alll.end())
    {
        string newna;
        cin>>newna;
        string oldna=all[it2->second].getnames();
        all[it2->second].xiugaina(newna);
        al.erase(oldna);
        al.insert(make_pair(newna,it2->second));
    }
}
void setstudent::cutstudent()
{
    string renming;
    cin>>renming;
    multimap<string,int>::iterator it1;
    multimap<string,int>::iterator it2;
    it1=al.find(renming);
    it2=alll.find(renming);
    if(it1!=al.end())
    {
        all[it1->second].xiugaicun();//置为0
    }
    if(it2!=alll.end())
    {
        all[it2->second].xiugaicun();//置为0
    }
}
int main()
{
    int n;
    setstudent cao;
    cao.readstudent();
    for(auto it1=cao.all.begin();it1!=cao.all.end();it1++)
    {
        cout<<(*it1)<<endl;
    }
    for(auto it2=cao.al.begin();it2!=cao.al.end();it2++)
    {
        cout<<it2->first<<" "<<it2->second<<endl;
    }
    for(auto it3=cao.alll.begin();it3!=cao.alll.end();it3++)
    {
        cout<<it3->first<<" "<<it3->second<<endl;
    }
    cin>>n;
    while(n--)
    {
        cao.addstudent();
    }
    cao.chazhao();
    cao.fixstudent();
    cao.cutstudent();
    cao.writestudent();
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值