【发布时间】: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。