2012-04-09 7 views
1

あるマップの内容を別のマップに挿入しようとしています。ここでは、コードは次のとおりマップに挿入するときにsegフォルトが発生するのはなぜですか?

std::map<std::string, int> Student::getGrades() const; 
... 

for(set<Student*, Cmp>::const_iterator it = s.begin(); it!=s.end(); ++it) 
{ 
    grades.clear(); 
    grades.insert((*it)->getGrades().begin(), (*it)->getGrades().end()); 
    for(map<string, int>::const_iterator itt = grades.begin(); itt!=grades.end(); ++itt) 
    { 
     if(itt->first == course && itt->second >= score1 && itt->second <= score2) 
      (*it)->display(cout); 
    } 
} 

sがgetGradesマップを返す()メソッドを持つ学生オブジェクトと各生徒のオブジェクトへのポインタを含むセットです。私はファイルから読み込んだ成績と一致する成績を見つけようとしており、それらの成績に対応する記録を印刷しています。しかし、insertメソッドは私にsegaultを与えています。助言がありますか?

+2

「Student :: getGrades()」の宣言を表示できますか? – alexisdm

答えて

3

getGrades()がグレードマップのコピーであり参照番号ではない場合、begin()end()は2つの異なるマップに属します。

おそらくローカルコピーを作成し、このようなコードを簡素化する必要があります。

for(set<Student*, Cmp>::const_iterator it = s.begin(); it!=s.end(); ++it) 
{ 
    map<string, int> grades = (*it)->getGrades(); 
    for(map<string, int>::const_iterator itt = grades.begin(); itt!=grades.end(); ++itt) 
    { 
     if(itt->first == course && itt->second >= score1 && itt->second <= score2) 
      (*it)->display(cout); 
    } 
} 
+0

それを修正しました!本当にありがとう! – Strata

0

セットsで初期化されていないポインタがあるかもしれません。

関連する問題