使用for循环可能误解map迭代器

时间:2013-05-13 03:00:17

标签: c++ map

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

我目前正在尝试完成大学面向对象C ++课程的最终项目。我正在创建一个学生数据库来存储学生的考试成绩。我的设置有很多自定义类,但都完美地工作(或者至少做我想让他们做的事情)。

项目设置如下:

我有一张所有“课程”的“主”地图,所有内容都指向该地图(如果不止一个学生正在学习,那么课程就不会重复)。

“学生”是指向“课程”的指针向量和相应的双“结果”,我有一张系统中所有学生的主地图。

“学位”是一组两个指针向量,一个是由该学位提供的课程,另一个是学习该学位的学生。创建学位后,它会搜索两个主地图。如果课程ID中的前x个字母与学位前缀匹配,则添加课程。如果学生的科目与课程名称相符,则会添加学生。

我的问题是:

由于我有一些选项可以在CSV文件初始设置后手动输入课程和学生,我已经编写了一个函数来更新我的学位,如果添加了一个应该包含在学位中的课程/结果(见下文)。然而,这个代码不可避免地导致第一个课程和学生在第一次调用该函数时被重新添加(即重复)到第一个学位。如果再次调用该函数,则不会重复此问题。我完全不知道为什么。后来有大量的时间和cout陈述,我没有更接近解决这个问题。我错过了第一次运行的明显事实吗?我可能错误地设置了循环(我对地图不是很熟悉)。不要犹豫,称我为白痴!

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

提前感谢您的时间。

//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; 
}

1 个答案:

答案 0 :(得分:0)

您可以在课程列表中按值存储course,然后将指针用于此对象。显然,你应该在地图中存储指针。我认为(*a == &(x->second))在第一次运行时失败,并且路线图中指向对象的指针被添加到degree对象。在第二次运行中,(*a == &(x->second))成功,一切正常。 student地图也一样。