首页 > 解决方案 > 插入集合并收到分段错误

问题描述

我创建了转换图形表示的代码(边列表 -> 邻接列表)

我该如何修复错误?

我在输入线上 有分段错误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;
    }
}

标签: c++stl

解决方案


您的代码中有几个错误,因此您收到了该错误。

  1. 您希望将图形边缘作为字符串。因此,您需要将边缘输入作为字符串。为此,您需要使用 getline(cin,input) 和 cin.ignore()。(我的建议:不要将输入作为字符串,因为它是你之后将它们转换为整数。默认情况下,如果你只写 cin<<node1<<node2; 边的两个节点将作为整数和函数 strToSotredPair不需要)。

  2. 在函数 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;
        }
    }


推荐阅读