问:如果是异常,编译器如何使用调用堆栈定位错误?
#include <iostream>
#include <sstream>
#include <vector>
#include <algorithm>
#include<cmath>
#include <map>
using namespace std;
stringstream ss;
int main()
{
int n,m;
cin>>n>>m;
vector<multimap<int,char*>> vm;
map<char*,vector<int>> info;
int i=0;
int a,c,math,e;char id[8];
while(i<n)
{
scanf("%s",id);
cin>>c>>math>>e;
a=(c+math+e)/3;
vm[0].insert(pair<int,char*>(a,id));
vm[1].insert(pair<int,char*>(c,id));
vm[2].insert(pair<int,char*>(math,id));
vm[3].insert(pair<int,char*>(e,id));
vector<int> v(4);
v[0]=a;v[1]=c;v[2]=math;v[3]=e;
info.insert(pair<char*,vector<int>>(id,v));
i++;
}
vector<map<int,char*,greater<int>>> vmm;
for(int i=0;i<4;i++)
{
int count=0;
auto it=vmm[i].begin();
while(it!=vmm[i].end())
{
count+=vmm[i].count(it->first);
vmm[i].insert(it->first,count);
int i=count;
while(i--)
it++;
}
}
char arrstr[2001][8]; //[m][6]
i=0;
while(i<m)
scanf("%s",arrstr[i++]);
i=0;
while(i<m)
{
char c;
if(info.find(arrstr[i])==info.end()) //
{cout<<"N/A";i++;continue;}
auto vGrade=info[arrstr[i]];
int rank=2000;
for(int i=0;i<4;i++)
{
auto it=vmm[i].find(vGrade[i]);int gap=1;
while(it!=vmm[i].begin())
{
gap++;
it--;
}
rank=rank<gap?rank:gap;
if(rank>gap)
{
rank=gap;
if(i==0) c='A';
else if(i==1) c='C';
else if(i==2) c='M';
else c='E';
}
cout<<rank<<" "<<c;
}
i++;
}
system("pause");
return 0;
}
答:为什么C ++代码放置Java标记?
这样设置问题时,您不认识编辑器吗?
精通业务
编译器错误是最好的调试错误之一,所有错误都由编译器明确告知
。在代码中的以下代码行:
vmm[i].insert(it->first,count);
这里vmm[i]这是一个map<int,char*>,更何况,它需要插入值时使用的pair<int, char*>包装键值对,it->first这是一个int,count这也是一个int,值类型和map的定义不匹配。
如果您不关心插入的返回值,我认为它map[key] = value以更简洁的方式很有用