当我运行以下代码时出现分段错误。
给定一个人员列表,每个人都有一组整数,如果一个人与另一个人共有的整数数大于给定的阈值K
#include <algorithm>
#include <iostream>
#include <queue>
#include <vector>
using namespace std;
class B {
public:
vector<int> b;
B() { b.reserve(301); }
};
int count(vector<int> u, vector<int> v) // To count the number of integers one
// vector has with the other
{
sort(u.begin(), u.end());
sort(v.begin(), v.end());
int i = 0, j = 0, ctr = 0;
while (i < u.size() && j < v.size())
if (u[i] == v[j])
ctr++;
else if (u[i] > v[j])
j++;
else
i++;
return ctr;
}
int main() {
B null;
int n, k, p, temp,
ctr = 0; // n is number of people and k is the threshold value
cin >> n >> k;
vector<B> id;
id.resize(n);
bool isfriend[n];
for (int i = 0; i < n; i++) {
cin >> p; // p is the number of integers for the person i
for (int j = 0; j < p; j++) {
cin >> temp;
id[i].b.push_back(
temp); // If this line is removed, there is no segmentation fault
}
}
for (int i = 0; i < n; i++)
isfriend[i] = false;
isfriend[0] = true;
queue<int> q;
q.push(0);
while (q.empty() == false) {
p = q.front();
q.pop();
for (int i = 0; i < n; i++)
if (isfriend[i] == false) {
temp = count(id[p].b, id[i].b);
if (temp >= k) {
ctr++;
q.push(i);
isfriend[i] = true;
}
}
}
cout << ctr; // No. of friends of person 0
return 0;
}
谁能告诉我哪里出错了?
你的计数逻辑有缺陷。 这导致了一个无休止的循环。 我猜你看到一个分段错误,因为你在一个类似黑客兰克的在线系统中,中断了你的代码:
问题就在这里:
while(i<u.size()&&j<v.size())
if(u[i]==v[j])
ctr++; // <======= once there is a match i, and j never get updated
else if(u[i]>v[j])
j++;
else
i++;
校正:
while(i<u.size()&&j<v.size())
if(u[i]==v[j]) {
ctr++;
i++; j++; // <--- skip the matching elements
}
else if(u[i]>v[j])
j++;
else
i++;
当您按照评论中的说明删除push_back()
时,问题消失了,因为比较循环将立即结束。
不相关:
考虑避免使用可变长度数组,因为这些数组不是标准C++。 因此,与其
bool isfriend[n];
更喜欢vector<bool> isfriend(n, false);
,不如说它的优点是避免了您不必编写一个 for 循环来初始化值。避免将变量命名
null
。 这是令人困惑的。 因此,无论如何都不需要B null;
删除该语句。在线演示,其中包含更正的代码以及这些建议和一个小的测试示例。