0
#include<utility>
#include<iostream>
#include<cstdlib>
#include<cstdio>
#include<map>
#include<vector>
#include<set>
#define M 100000
using namespace std;

int main() {
    map<char, vector<pair<char,int> > > graph;
    vector<pair<char,int> > vector1;
    vector1.push_back(pair<char,int>('B',4));
    graph['A'] = vector1;
    map<char,int> citydistances;
    citydistances['A'] = 0;

    vector<pair<char,int> >::iterator edge;
    for (map<char,int>::iterator i=citydistances.begin(); i!=citydistances.end(); ++i) {
        vector<pair<char, int> > cities = graph[i->first];
        for (vector<pair<char,int> >::iterator j=cities.begin(); j!=cities.end(); ++j) {
            if (citydistances.find(j->first)==citydistances.end()) {
                edge = j;
                //point 1
                cout<<edge->first<<endl;
            }
        }
    }
    //point 2
    cout<<edge->first<<endl;
    return 0;
}

動作が予期しない部分に焦点を当てるために、コードをできるだけ短くしようとしました。edge->firstポイント 1 とポイント 2の値が異なる理由がわかりません。edge->firstポイント1では「B」ですが'\000'、ポイント2です。誰か助けてもらえますか?

4

1 に答える 1

7

edge = j(ポイント 1 の直前)、 whilejは vector への反復子citiesです。ポイント 2 では、ベクトルが破棄されているため、edge ( edge->first) を逆参照すると、未定義の動作が発生します。

cities参照を作成することで修正されます。

vector<pair<char, int> > &cities = graph[i->first];
于 2013-08-22T21:06:28.710 に答える