簡體   English   中英

向量下標超出c ++中的范圍錯誤

[英]vector subscript out of range error in c++

我正在嘗試編寫一個接受n個整數輸入的程序,並找出在給定輸入中出現最大次數的程序。 我正在嘗試運行t案例的程序。 為此,我實現了一種類似於算法的計數排序(可能有點過時),它計算輸入中每​​個數字的出現次數。 如果有多個具有相同最大出現次數的數字,我需要返回其中較小的數字。 為此,我實施了排序。
我面臨的問題是,每次我在Visual C ++上運行程序時,我都會收到一個錯誤,告訴“向量下標超出范圍”。 在Netbeans下,它產生的返回值為1並退出。 請幫我找到問題所在

   #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;
}

a.clear() ,向量沒有任何成員,其大小為0。

添加對a.resize(n)的調用以使其大小合適。 您還需要將buff調整到需要的大小。

這條線是罪魁禍首:

 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];
    }

然后你應該通過引用傳遞你的矢量findmax

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

這不是填充數組的方式。

cin>>a[i];

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

問題是你非法使用不存在的向量索引(你永遠不會向向量添加任何項)。 由於您知道尺寸,因此可以在清除尺寸后調整尺寸:

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

        cin>>a[i];
    }

將超出范圍。 構造它時,矢量的大小為零。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM