【问题标题】:vector subscript out of range error in c++C++中的向量下标超出范围错误
【发布时间】:2012-02-01 18:02:34
【问题描述】:

我正在尝试编写一个程序,该程序接受 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;
}

【问题讨论】:

  • 这可以通过调试器解决,或者简单地通过添加一堆额外的cout 语句来检查所有索引。
  • C++ Assertion Failed on vector at runtime Expression: vector subscript out of range 的可能重复项 - 你永远不会增加 vector 的大小,因此它是 0
  • @OliCharlesworth:对不起,使用调试器没有用
  • @javacoder990:是的。只需单步执行您的程序,直到其行为与您的预期不同。然后你就找到了你的错误。
  • 您似乎根本没有填写buff

标签: c++ algorithm stl vector


【解决方案1】:

a.clear()之后的vector没有任何成员,其大小为0。

添加对a.resize(n) 的调用以使其大小合适。您还需要将buff 调整为所需的大小。

【讨论】:

    【解决方案2】:

    这行是罪魁祸首:

     cin>>a[i];
    

    你必须使用 push_back:

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

    或者resize(n)之前:

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

    那么你应该通过引用 findmax 来传递你的向量

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

    【讨论】:

    • 不是std::vector::reserve,而是std::vector::resize 做他想做的事。
    【解决方案3】:

    这不是你填充数组的方式。

    cin>>a[i];
    

    你需要使用push_back()方法或者预先分配合适的大小。

    【讨论】:

    • 谢谢,正如我在上面的评论中提到的,我确实实现了这个。
    【解决方案4】:

    问题是您非法使用了不存在的向量索引(您从不向向量添加任何项目)。既然你知道大小,你可以在清除后调整大小:

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

    【讨论】:

      【解决方案5】:
          for ( i = 0; i < n; i++) {
      
              cin>>a[i];
          }
      

      将超出范围。在您构造它时,向量的大小为零。

      【讨论】:

        猜你喜欢
        • 2011-07-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-05-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多