C++ 交叉链接向量中的分割错误
我试图得到一个学生向量和一个大学向量,每个学生都有一个他申请的大学列表,每个大学都有一个申请的学生列表。 但是当我运行代码时,“分段错误:11”发生了。请你帮我理解一下,我哪里做错了C++ 交叉链接向量中的分割错误,c++,C++,我试图得到一个学生向量和一个大学向量,每个学生都有一个他申请的大学列表,每个大学都有一个申请的学生列表。 但是当我运行代码时,“分段错误:11”发生了。请你帮我理解一下,我哪里做错了 struct Student; struct Univercity { std::string name; int vacancies; std::vector<Student *> students; Univercity(std::string name,
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”中使用指向其元素的指针;我没注意到星号。。。不要介意。