2017-09-07 41 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

關於[爲什麼我不應該#include ?](https://stackoverflow.com/questions/31816095/why-should-i-not-include-bits-stdc-h) 。但是,當它與'使用名稱空間標準'一起使用時,代碼不僅包含整個標準庫,還將整個標準庫引入全局名稱空間,其中有數以萬計的標識符,其中一些非常常見,比如'swap'和'reverse',可能會與代碼中定義的標識符相沖突,以獲得意外的結果。 – user4581301

回答

1

我不知道這個問題有具體迭代器做。

在循環開始時,變量i在使用前遞增,這意味着i將在範圍之間的數字集合爲[1, vector.size()]。這意味着在某些時候,您將訪問vector[vector.size()],這是未定義的行爲,可能會導致程序崩潰。

在你的程序而言,給你提供的輸入,因爲沒有在您的示例代碼中的數字是重複的,就總是執行std::find(...)條件語句的else分支,這意味着你最終會在某個時候調用visited[30],這又一次超出了界限和未定義的行爲,可能導致崩潰。

+0

這是我的錯誤!非常感謝你的幫助!! –

+0

@satheeshv如果你使用'visited.at(i)'而不是'visited [i]',你會立即發現你的錯誤,因爲會拋出一個'std :: out_of_range'異常。 – PaulMcKenzie

+0

有道理@PaulMcKenzie –