2016-09-28 9 views
-1

のうち、ベクトル添字を失敗し、私はエラーメッセージデバッグアサーションが範囲

を持つ保つ「デバッグアサーションに失敗しました。ベクトル添字を範囲外。」私== 2.しかし、私は後に、私== 2間違って何見当がつかないとき

ので、私はループのために追跡され、入力が

5 
1 100 
2 100 
3 80 
4 60 
5 80 

いるときにエラーが発生しました。 お願いします。

エラーはこの部分である:

for (int i = 0; i < childNum; i++) { 
     if (!IncrementIfFound(value_counts, info.gram_v[i])) { 
      Number_Counts temp(info.gram_v[i]); 
      value_counts.push_back(temp); 
      cout << "Value counts: " << value_counts[i].value << "\t" << value_counts[i].count << endl; 
     } 
    } 

そして、これは私のコードです:あなたifは最初n反復をスキップした場合

struct Number_Counts 
{ 
    int value; 
    int count; 
    Number_Counts(int _element) { value = _element; count = 1; } 
}; 

struct ChildInfo 
{ 
    vector<int> id_v; 
    vector<int> gram_v; 
}; 

bool IncrementIfFound(vector<Number_Counts> &, int); 

bool IncrementIfFound(vector<Number_Counts> &_Container, int _element) 
{ 
    for (int i = 0; i < _Container.size(); i++) { 
     if (_Container[i].value == _element) { 
      _Container[i].count++; 
      cout << "i : " << i <<" Container value: " << _Container[i].value << " counter: " << _Container[i].count 
       << " size: " << _Container.size() << endl; 
      return true; 
     } 
    } 
    return false; 
} 

int main() { 
    vector<Number_Counts> value_counts; 
    ChildInfo info; 
    int childNum,id, gram = 0; 

    cin >> childNum; 
    for (int i = 0; i < childNum; i++) { 
     cin >> id >> gram; 
     info.id_v.push_back(id); 
     info.gram_v.push_back(gram); 
    } 

    for (int i = 0; i < childNum; i++) { 
     if (!IncrementIfFound(value_counts, info.gram_v[i])) { 
      Number_Counts temp(info.gram_v[i]); 
      value_counts.push_back(temp); 
      cout << "Value counts: " << value_counts[i].value << "\t" << value_counts[i].count << endl; 
     } 
    } 

    return 0; 
} 

答えて

0
for (int i = 0; i < childNum; i++) { 
    if (!IncrementIfFound(value_counts, info.gram_v[i])) { 
     Number_Counts temp(info.gram_v[i]); 
     value_counts.push_back(temp); 
     cout << "Value counts: " << value_counts[i].value << "\t" << value_counts[i].count << endl; 
    } 
} 

を想像してみてください。 value_counts[i].valueにアクセスするよりも、新しい値がベクトルに追加されなかったため、配列境界を超えてアクセスすることになります。

 auto&& number_count = value_counts.back(); 
     cout << "Value counts: " << number_count.value << "\t" << number_count.count << endl; 
+0

単に「temp」を印刷しないのはなぜですか? –

+0

@MuhammadAhmadこれもオプションです。しかし、一般的には、このオプションは等しくないので、OPがベクタにプッシュされたオブジェクトを印刷したい場合は、これが正しい方法です。 –

+0

Ohhhh大変ありがとうございます@Satus – Hmmmmm