2012-02-01 52 views
2

我想寫一個程序,需要輸入的n個整數,並找出出現在給定的輸入的最大次數的程序。我正在嘗試運行t案例。 爲此,我實現了一種類似於算法的計數排序(可能有點令人厭煩),它計算輸入中每​​個數字的出現次數。如果有多個數字具有相同的最大值,我需要返回其中較小的數字。爲此,我實施了排序。
我面對的問題是,每次我在Visual C++上運行程序時,都會收到一個錯誤,告知「向量下標超出範圍」。在Netbeans下,它產生1的返回值並退出。請幫我看看這個問題矢量下標超出範圍錯誤在C++

#include <cstdio> 
    #include <cstdlib> 
    #include <cstring> 
    #include <iostream> 
    #include <algorithm> 
    #include <vector> 


using namespace std; 

int findmax(vector<int> a, int n) 
{ 
    int i,ret; 
    ret = 0; 
    for (i = 0; i <n; i++) 
    { 
     if (a[i] > ret) { 
       ret = a[i]; 
     } 
    } 
    return ret; 
} 


int main() { 
    int i = 0, j = 0, k = 0, n,m,r1,r2; 
    vector<int> a; 
    int t; 
    vector<int> buff; 

    cin>>t; 
    while(t--) { 

     cin>>n; 
     a.clear(); 
     buff.clear(); 
     for (i = 0; i < n; i++) { 

      cin>>a[i]; 
     } 

     sort(a.begin(),a.end()); 
     m = findmax(a,n); 
     for (j = 0; j < m+1; j++) { 
      buff[a[j]] = buff[a[j]] + 1; 
     } 
     k = findmax(buff,m+1); 

     for (i = 0; i < m+1; i++) { 
      if (buff[i] == k) { 
       r1 = i; 
       r2 = buff[i]; 
       break; 
      } 
     } 

     cout<<r1<<" "<<r2<<endl; 
    } 
    return 0; 
} 
+1

這可以通過調試器解決,或者只需添加一堆額外的'cout'語句來檢查所有索引。 – 2012-02-01 18:04:30

+1

[C++ Assertion在運行時向量上失敗表達式:向量下標超出範圍]的可能重複(http://stackoverflow.com/questions/5736813/c-assertion-failed-on-vector-at-runtime-expression-vector -subscript-out-of-ra) - 你永遠不會增加你的vector的大小,所以它是'0' – 2012-02-01 18:04:51

+0

@OliCharlesworth:對不起,使用調試器是沒有用的 – hytriutucx 2012-02-01 18:05:47

回答

5

a.clear()後的矢量沒有任何成員,它的大小爲0。

添加一個電話a.resize(n),使其成爲適當的大小。您還需要將buff調整爲任何需要的大小。

2

這不是你如何填充數組。

cin>>a[i]; 

您需要使用push_back()方法或預先分配適當的大小。

+0

謝謝,正如我在上面的評論中提到的,我確實實現了這一點。 – hytriutucx 2012-02-01 18:10:56

2

問題是你非法使用你的矢量不存在的索引(你永遠不會向矢量添加任何項目)。既然你知道的大小,你可以以後你清楚它調整它的大小:

a.clear(); 
a.resize(n); 
buff.clear(); 
buff.resize(n); 
2

此行是罪魁禍首:

cin>>a[i]; 

必須使用的push_back:

cin >> temp; 
    a.push_back(temp); 

或調整( n)之前:

cin>>n; 
    a.resize(n); 
    for (i = 0; i < n; i++) { 
     cin>>a[i]; 
    } 

the n您應該通過引用傳遞你矢量findmax

int findmax(vector<int> &a, int n) 
... 
+0

不是'std :: vector :: reserve',而是'std :: vector :: resize'做了他想做的事情。 – 2012-02-01 18:09:19

2
for (i = 0; i < n; i++) { 

     cin>>a[i]; 
    } 

會超出範圍。該矢量在構建時具有零大小。