c++ - 插入集合并收到分段错误
问题描述
我创建了转换图形表示的代码(边列表 -> 邻接列表)
我该如何修复错误?
我在输入线上 有分段错误res[cur.first - 1].insert(cur.second);
4 3
3 2
2 1
4 2
我的代码
#include <bits/stdc++.h>
using namespace std;
pair<int, int> strToSotredPair(const string& s) {
int a = 0, b = 0;
int pos = 0;
while (s[pos] != ' ') {
a = a * 10 + s[pos] - '0';
++pos;
}
while (pos < s.size()) {
b = b * 10 + s[pos] - '0';
++pos;
}
return {min(a, b), max(a, b)};
}
int main() {
int n, m;
string input;
cin >> n;
cin >> m;
vector<set<int>> res(n, set<int>());
for (int i = 0; i < m; ++i) {
cin >> input;
auto cur = strToSotredPair(input);
res[cur.first - 1].insert(cur.second); // error in this line
}
for (int i = 0; i < res.size(); ++i) {
cout << res[i].size() << ' ';
for (auto item : res[i]) {
cout << item << ' ';
}
cout << endl;
}
}
解决方案
您的代码中有几个错误,因此您收到了该错误。
您希望将图形边缘作为字符串。因此,您需要将边缘输入作为字符串。为此,您需要使用 getline(cin,input) 和 cin.ignore()。(我的建议:不要将输入作为字符串,因为它是你之后将它们转换为整数。默认情况下,如果你只写 cin<<node1<<node2; 边的两个节点将作为整数和函数 strToSotredPair不需要)。
在函数 strToSotredPair 中获得整数 a 后,pos 变量指向空间。因此,您需要将其增加 1 以指向第二个数字的起始位置。因此需要一个 pos++。
#include <bits/stdc++.h>
using namespace std;
pair<int, int> strToSotredPair(const string& s) {
int a = 0, b = 0;
int pos = 0;
while (s[pos] != ' ') {
a = a * 10 + s[pos] - '0';
++pos;
}
pos++;
while (pos < s.size()) {
b = b * 10 + s[pos] - '0';
++pos;
}
return {min(a, b), max(a, b)};
}
int main() {
int n, m;
string input;
cin >> n;
cin >> m;
vector<set<int>> res(n, set<int>());
cin.ignore(); // To clear the input buffer
for (int i = 0; i < m; ++i) {
getline(cin, input); // to get line by line string inputs
auto cur = strToSotredPair(input);
res[cur.first - 1].insert(cur.second);
}
for (int i = 0; i < res.size(); ++i) {
cout << res[i].size() << ' ';
for (auto item : res[i]) {
cout << item << ' ';
}
cout << endl;
}
}
推荐阅读
- r - 如何将具有多个相似列但具有单个不同列的行组合起来
- mysql - 银行数据库中的“客户ID”可以有什么样的数据类型?INT 还是 VARCHAR?
- android - Android FCM 通知未弹出
- javascript - 视频不渲染
- oauth-2.0 - 使用 OAUTH 验证 Salesforce 客户用户失败
- java - 无法通过 Testrunner 类运行 Cucumber 场景作为 Intellij 中的 TestNG 测试
- vba - 将外部文本文件导入ppt文本框
- c++ - 使用 `std::max_element` `error: void value not ignored as it should be`
- java - Jpa 无法将 json 映射到每次都重新创建的实体
- sql - LeetCode SQL (Oracle) Answer 得到“Accepted”,但系统提示错误