原代码:
istream& operator>>(istream& is, map<string, int>&mm)
{string ss="";int ii=0;is >> ss>>ii;mm[ss]=ii;return is;
}int main()
{map<string,int>msi;while(cin>>msi);return 0;
}
问题:
当用^Z终止while(cin>>msi)时,^Z会被读入ss,msi会被插入msi[ss]=0;
原因:
^Z被当作string读入,当再次输入^Z时,while循环才会被终止;
解决方案:
如果ii没有被写入新值,则不插入一新map元素,此时,读入ss的^Z会随着离开局部作用域而销毁。如下:
istream& operator>>(istream& is, map<string, int>&mm)
{string ss="";int ii=0;is >> ss;if(is>>ii)mm[ss] = ii;return is;
}
解决思路:
1.查看控制台输出,得知^Z被当作string读入;
2.试图通过监控流的状态来防止^Z被读入。例如当读取到流末尾的时候,停止读入。但是^Z依然被当作流末尾。故该措施无效;
3.查看>>操作符,想到既然只有ss被赋值,ii没有被赋值,故而可以以ii是否被赋值为条件,来决定是否插入新的map元素。