上节课老师教授了两种方式解决删除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;
}