调试断言失败(矢量下标超出范围)



我发现我的result.push_back(make_pair(a[i], b[j]));导致这个错误,但我不知道为什么(我甚至不访问vector<pair<int,int>>result;(

#include<iostream>
#include<vector>
#include<algorithm>
#include<math.h>
#include<utility>
using namespace std;
void input(int n,vector<int>&a) {
int temps;
for (int i = 0; i < n; i++) {
cin >> temps;
a.push_back(temps);
}
}
int main() {
//input
long n, m;
cin >> n; //6
vector<int>a, b;
input(n, a); //{2 5 4 1 7 5}
cin >> m; //7
input(m, b); //{2 3 1 3 2 4 6}
//algorithm
long max = *max_element(a.begin(), a.end()) + *max_element(b.begin(), b.end());
long min = *min_element(a.begin(), a.end()) + *min_element(b.begin(), b.end());
vector<pair<int, int>>result;
int possible = max, plate = 0; 
for (int check = max; check >= min; check--) {
int j = 0, i = 0, plate2 = 0;
for (; i < a.size(); i++) {
if (a[i] >= check) {}
else {
if (j > b.size() - 1) { break; }
if (a[i] + b[j] >= check) {
j++; plate2++;
result.push_back(make_pair(a[i], b[j]));
}
else {
i--; j++;
}
}
}
if (i > a.size() - 1) { possible = check; plate = plate2; break; } 
}
cout << possible << " " << plate << endl; //5 3 
return 0;
}

如果删除行result.push_back(make_pair(a[i],b[j]);,就不再有错误消息,所以我认为我没有访问错误的a[i]和b[j]元素

if (j > b.size() - 1) { break; }  //(1)
if (a[i] + b[j] >= check) {  //(2)
j++; plate2++;   // HERE IS YOUR PROBLEM (3)
result.push_back(make_pair(a[i], b[j]));   //(4)

假设CCD_ 4在开头。if (j > b.size() - 1)子句为false,因此循环不包含break。它继续(2(,这是可以的。在(3(中,您将+1添加到j,因此现在是j == b.size()。在(4(中,您尝试访问b[j],它现在是无效的b[b.size()],因为独立从0开始。

IOW:您试图确保j永远不会超过有效元素的数量,但在测试之后您会增加j并访问无效内存。

最新更新