Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/161.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 交叉链接向量中的分割错误_C++ - Fatal编程技术网

C++ 交叉链接向量中的分割错误

C++ 交叉链接向量中的分割错误,c++,C++,我试图得到一个学生向量和一个大学向量,每个学生都有一个他申请的大学列表,每个大学都有一个申请的学生列表。 但是当我运行代码时,“分段错误:11”发生了。请你帮我理解一下,我哪里做错了 struct Student; struct Univercity { std::string name; int vacancies; std::vector<Student *> students; Univercity(std::string name,

我试图得到一个学生向量和一个大学向量,每个学生都有一个他申请的大学列表,每个大学都有一个申请的学生列表。 但是当我运行代码时,“分段错误:11”发生了。请你帮我理解一下,我哪里做错了

struct Student;

struct Univercity
{
    std::string name;
    int vacancies;
    std::vector<Student *> students;

    Univercity(std::string name,
               int vacancies)
        : name(name),
          vacancies(vacancies) {}
};

struct Student {
    std::string name, surname;
    int d, m, y;
    int points;
    std::vector<Univercity *> univercities;

    Student(std::string name,
            std::string surname,
            int d, int m, int y, int points,
            std::vector<Univercity *> univercities)
        : name(name),
          surname(surname),
          d(d), m(m), y(y),
          univercities(univercities) {}
};

void input(std::vector <Student> *students,
           std::vector <Univercity> *univercities) {
    int n;
    std::cin >> n;
    for (int i = 0; i < n; i++) {
        std::string name;
        int vacancies;
        std::cin >> name >> vacancies;
        univercities->push_back(Univercity(name, vacancies));
    }
    std::cin >> n;
    for (int i = 0; i < n; i++) {
        std::string name, surname;
        int d, m, y, points;
        int k;
        std::vector<Univercity *> applications;
        std::string uni_name;
        std::cin >> name >> surname >> d >> m >> y >> points >> k;
        for (int j = 0; j < k; j++) {
            std::cin >> uni_name;
            for (auto u : *univercities) {
                if (u.name == uni_name) {
                    applications.push_back(&u);
                    break;
                }
            }
        }
        students->push_back(Student(name, surname, d, m, y,
                                    points, applications));
    }

}

int main() {
    std::vector <Univercity> univercities;
    std::vector <Student> students;
    input(&students, &univercities);
    for (auto s : students) {
        std::cout << s.surname << " " << s.univercities.size() << "\n";
        for (auto u : s.univercities) {
            std::cout << u->name << " " << u->vacancies << "\n";
        }
    }
}

当您阅读输入时,您有:

for (auto u : *univercities) {
    if (u.name == uni_name) {
        applications.push_back(&u);
        break;
    }
}
在基于范围的for循环中,
u
是向量中元素的副本。因此,一旦你离开循环,你推到向量中的地址就无效了。使用

for (auto& u : *univercities) { //...

使用引用并避免复制。

阅读输入时:

for (auto u : *univercities) {
    if (u.name == uni_name) {
        applications.push_back(&u);
        break;
    }
}
在基于范围的for循环中,
u
是向量中元素的副本。因此,一旦你离开循环,你推到向量中的地址就无效了。使用

for (auto& u : *univercities) { //...

使用引用并避免复制。

应用程序。向后推(&u)

您正在向
应用程序
推送指向
大学
元素的指针。但是
univercities
input
函数(以及它的所有内容)的末尾不再存在。所以在这之后,
应用程序中的指针
向量不会指向现有对象

顺便说一句:“大学”,而不是“大学”


编辑:我错了。向量通过指针传递,所以它仍然存在。抱歉,没有注意到星号。

应用程序。向后推(&u)

您正在向
应用程序
推送指向
大学
元素的指针。但是
univercities
input
函数(以及它的所有内容)的末尾不再存在。所以在这之后,
应用程序中的指针
向量不会指向现有对象

顺便说一句:“大学”,而不是“大学”


编辑:我错了。向量通过指针传递,所以它仍然存在。抱歉,没有注意到星号。

解决此类问题的正确工具是调试器。在询问堆栈溢出之前,应该逐行检查代码。如需更多帮助,请阅读。至少,你应该[编辑]你的问题,包括一个重现你的问题的例子,以及你在调试器中的观察结果。你的老师没有教你如何通过引用传递论点吗?您是否需要使用
std::vector
?看起来,将一个名字映射到一所大学可能更好。也许是指向
input
函数中使用的大学的指针的映射,因此您不必使用手动循环来查找大学?解决此类问题的正确工具是调试器。在询问堆栈溢出之前,应该逐行检查代码。如需更多帮助,请阅读。至少,你应该[编辑]你的问题,包括一个重现你的问题的例子,以及你在调试器中的观察结果。你的老师没有教你如何通过引用传递论点吗?您是否需要使用
std::vector
?看起来,将一个名字映射到一所大学可能更好。也许是指向
输入
函数中使用的大学的指针的映射,这样您就不必使用手动循环来查找大学了?似乎我可以在开始时删除免责声明;)似乎我可以在开始时删除免责声明;)指针在循环结束时(更具体地说是在每次迭代结束时)已经无效,而不是在
input
函数结束时。是的,我在阅读了您的答案后才意识到。但即使是for循环中的引用,它也会像我上面所说的那样。不会的,因为引用是指向向量中的元素向量
通过引用传递(即通过指针),因此,在函数中使用指向其元素的指针是可以的,但是向量在传递给函数时被复制,并且当函数结束时副本将不存在@tobi303“向量是通过引用(即通过指针)传递的,因此可以在函数“oh,did”中使用指向其元素的指针;我没注意到星号。。。没关系。指针在循环结束时(更具体地说是在每次迭代结束时)已经无效,而不是在
输入
函数结束时。是的,我刚读了你的答案后意识到。但即使是for循环中的引用,它也会像我上面所说的那样。不会的,因为引用是指向向量中的元素向量
通过引用传递(即通过指针),因此,在函数中使用指向其元素的指针是可以的,但是向量在传递给函数时被复制,并且当函数结束时副本将不存在@tobi303“向量是通过引用(即通过指针)传递的,因此可以在函数“oh,did”中使用指向其元素的指针;我没注意到星号。。。不要介意。