gpt4 book ai didi

c++ - 对带有 for 循环的 map 迭代器的可能误解

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:57:20 24 4
gpt4 key购买 nike

恐怕是非常具体的问题(而且我还是个新手,所以提前致歉):

我目前正努力完成大学面向对象 C++ 类(class)的期末项目。我正在创建一个学生数据库来存储学生的考试成绩。我的设置有大量自定义类,但都运行良好(或者至少做我想让它们做的事)。

项目设置如下:

我有所有“类(class)”的“主” map ,所有内容都指向该 map (因此,如果有多个学生正在上课,则类(class)不会重复)。

“学生”是指向“类(class)”的指针 vector 和相应的双“结果”,我有系统中所有学生的主图。

“学位”是一个包含两个指针 vector 的类,一个指向该学位提供的类(class),一个指向攻读该学位的学生。创建学位后,它会搜索两个主 map 。如果类(class) ID 中的前 x 个字母与学位前缀匹配,则添加该类(class)。如果学生的科目与类(class)名称匹配,则添加该学生。

我的问题是:

由于我有一些选项可以在 CSV 文件的初始设置后手动输入类(class)和学生,所以我编写了一个函数来更新我的学位,如果添加了应该包含在学位中的类(class)/结果(见下文)。但是,此代码不可避免地会导致在第一次调用此函数时将第一门类(class)和学生重新添加(即重复)到第一学位。如果再次调用该函数,则不会重复此问题。我完全不知道为什么。大量的时间和 cout 声明之后,我离解决这个问题还差得很远。我错过了第一次运行的明显内容吗?我可能把循环设置错了(我对 map 不是很熟悉)。不要犹豫,叫我白痴!

正如我上面所说,程序的其余部分都是肉汁,如果没有这个奇怪的问题,程序就可以了。问题似乎也不是来 self 的打印功能。

提前感谢您的宝贵时间。

//upgrade degrees function: used whenever new courses or students could be created by the user. It ticks through all stored degrees and scans cd and sd. If it finds an unstored course or student that should be stored, they are added.

void degree_database::update_degrees(course_database &cd, student_database &sd) {
cout << "updating degrees..." << endl;

bool found = false;
vector<degree>::iterator current;
for (current = start; current < end; ++current) {

//scan course list
map<string, course>::iterator x;
for (x = cd.get_start(); x != cd.get_end(); ++x) {
if (x->first.substr(0,3) == current->get_prefix().substr(0,3) || current->get_prefix() == "ALL") {

//check to see if course is already stored
vector<course*>::iterator a;
for (a = current->get_c_start(); a < current->get_c_end(); ++a) {
if (*a == &(x->second)) {
found = true;
break;
}
}

//if found == true, then while loop broke early (i.e. the course was already stored).
if (found == false) current->add_course(x->second);
found = false;
}
}

//scan student list
found = false;
map<string, student>::iterator y;
for (y = sd.get_start(); y != sd.get_end(); ++y) {
if (y->second.get_subject() == current->get_name() || current->get_name() == "All") {

//check to see if course is already stored
vector<student*>::iterator b;
for (b = current->get_s_start(); b < current->get_s_end(); ++b) {
if (*b == &(y->second)) {
found = true;
break;
}
}

//if found == true, then while loop broke early (i.e. the student was already stored).
if (found == false) current->add_student(y->second);
found = false;
}
}

}

cout << "done." << endl;
}

最佳答案

您将 course 按值存储在类(class)列表中,然后使用指向此对象的指针 进行比较。显然,您应该在 map 中存储指针。我认为 (*a == &(x->second)) 在第一次运行时失败并且指向类(class) map 中的对象的指针被添加到 degree 对象。在第二次运行时,(*a == &(x->second)) 成功并且一切正常。 student map 也是如此。

关于c++ - 对带有 for 循环的 map 迭代器的可能误解,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16514283/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com