鍍金池/ 問答/Java  C++  HTML/ c++ vs編譯有錯誤雙擊error跳轉(zhuǎn)到內(nèi)部結(jié)構(gòu)實現(xiàn),怎么知道是哪句出錯了?

c++ vs編譯有錯誤雙擊error跳轉(zhuǎn)到內(nèi)部結(jié)構(gòu)實現(xiàn),怎么知道是哪句出錯了?

如果是異常還能用過調(diào)用堆棧定位錯誤,編譯器的錯誤該怎么定位?

clipboard.png

#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;
}
回答
編輯回答
假灑脫
  1. C++的代碼為什么要放java的標(biāo)簽?
  2. 問題排版成這樣難道不知道編輯嗎?

言歸正傳
編譯報錯是最好debug的錯誤之一,所有的錯誤編譯器都明確告訴你了

請看代碼中的這一行:

vmm[i].insert(it->first,count);

這里vmm[i] 是一個 map<int,char*>, 且不說插入值的時候需要用pair<int, char*>包裝鍵值對,it->first是一個int,count也是一個int,值的類型和map的定義不符。

如果不在乎insert的返回值的話,個人覺得用map[key] = value的方式更簡潔

2018年4月28日 20:19