2017-09-07 10 views
-1

このプログラムの問題点を教えてもらえますか? ベクトル配列がこれらのすべての条件を満たしている場合は、「はい」と表示されます。配列要素は昇順にソートされません。 配列には異なる要素が含まれています。 すべての配列要素は1〜nの値を持ちます。 "いいえ"の場合 if(bSort)の行に到達すると、プログラムは異常終了します。 イテレータのインクリメントに問題はありますか?ベクトルイテレータを使用するとプログラムが異常終了する

#include <iostream> 
#include <string> 
#include <bits/stdc++.h> 

using namespace std; 

std::string solve(vector <int> &a, int n) { 
    vector<int> visited (n); 
    int i=0; 
    for(std::vector<int>::iterator it = a.begin(); it != a.end(); ++it) { 
     i++; 
     if((it+1)!=a.end() && (*it > *(it+1))) 
     { 
      bSort = false; 
     } 
     if(std::find(visited.begin(), visited.end(), *it)!=visited.end()) 
     { 
      return "No"; 
     } 
     else 
     { 
      visited[i] = *it; 
     } 

     if(*it <= 0 || *it > n) 
     { 
      return "No"; 
     }  

    } 
    if(bSort) 
     return "No"; 
    else 
     return "Yes"; 

} 

int main() { 
    int q; 
    cin >> q; 
    for(int a0 = 0; a0 < q; a0++){ 
     int n; 
     cin >> n; 
     vector<int> a(n); 
     for(int a_i = 0; a_i < n; a_i++){ 
      cin >> a[a_i]; 
     } 
     std::string result = solve(a,n); 
     cout << result << endl; 
    } 
    return 0; 
} 

問題は、次の入力のみで起こっているように見える:

1 
30 
18 8 24 20 7 17 5 9 26 21 25 12 11 15 30 13 19 16 22 10 14 1 3 29 23 2 6 28 4 27 
+1

そして、デバッガを使用してクラッシュをキャッチすると、それは何を伝えますか?あなたのコードのどこでそれが起こりますか?次に、関係するすべての変数の値は何ですか?イテレータはどこに向いていますか? –

+0

'#include ' - これをしないでください。適切なヘッダーファイルを含めます。 – PaulMcKenzie

+0

[よくある質問はなぜ#ビット/ stdC++ .h?]でないといいですか?(https://stackoverflow.com/questions/31816095/why-should-i-not-include-bits-stdc-h) 。しかし、 'using namespace std;と一緒に使用すると、コードには標準ライブラリ全体が含まれるだけでなく、標準ライブラリ全体がグローバルな名前空間に引かれます。数十万の識別子があります。 'reverse'は予期しない結果のためにあなたのコードで定義された識別子と競合するかもしれません。 – user4581301

答えて

1

私は問題は特にイテレータに関係しているかわかりません。

ループの最初の部分では、変数iが使用される前にインクリメントされます。つまり、iの範囲になる数値のセットは[1, vector.size()]です。つまり、ある時点では、未定義の動作でプログラムをクラッシュさせるvector[vector.size()]にアクセスします。あなたのプログラムで

は、具体的には、あなたはいくつかの点でvisited[30]を呼び出してしまうことを意味する、あなたの例のコードの中の数字のどれが重複されていないので、std::find(...)条件文のelseブランチが常に実行され、指定した入力を与えられましたこれは再び境界外であり、定義されていない動作であり、潜在的にクラッシュを引き起こす。

+0

それは私の側からの大失敗だった!あなたの助けをありがとう! –

+0

@satheeshv 'visited [i]'の代わりに 'visited.at(i)'を使用した場合、 'std :: out_of_range'例外がスローされているので間違いをすぐに見つけられます。 – PaulMcKenzie

+0

意味@PaulMcKenzie –

関連する問題