矢量不能被覆盖

时间:2013-11-28 13:28:57

标签: c++ vector scheduling overwrite

我正在尝试为大学写一个程序。该计划的目标是为医院制定护士计划。但是,我现在真的被困住了。您可以在下面找到该程序的一个功能。

该功能的输入是一个名册,其中包括每位护士每天必须执行的班次。在这个例子中,我们有32行(32个护士)和28个列(代表28天)。每个单元格包含一个0到6的数字,表示休息日(0)或某个班次(1到6)。

该功能应该计算每一天,有多少护士被安排在某个班次。例如,在第一天,有8名护士执行班次2,班次班次3等等。函数的输出是双向量。

我认为这个功能大多是正确的,但是当我把它称为不同的名单时,程序总会给出第一个名单。

void calculate_nbr_nurses_per_shift(vector<vector<int>> roster1)
{
    for (int i = 0; i < get_nbr_days(); i++)
    {
        vector<int> nurses_per_shift;
        int nbr_nurses_free = 0;
        int nbr_nurses_shift1 = 0;
        int nbr_nurses_shift2 = 0;
        int nbr_nurses_shift3 = 0;
        int nbr_nurses_shift4 = 0;
        int nbr_nurses_shift5 = 0;
        int nbr_nurses_shift6 = 0;

        for (int j = 0; j < get_nbr_nurses(); j++)
        {
            if (roster1[j][i] == 0)
                nbr_nurses_free += 1;
            if (roster1[j][i] == 1)
                nbr_nurses_shift1 += 1;
            if (roster1[j][i] == 2)
                nbr_nurses_shift2 += 1;
            if (roster1[j][i] == 3)
                nbr_nurses_shift3 += 1;
            if (roster1[j][i] == 4)
                nbr_nurses_shift4 += 1;
            if (roster1[j][i] == 5)
                nbr_nurses_shift5 += 1;
            if (roster1[j][i] == 6)
                nbr_nurses_shift6 += 1;
        }

        nurses_per_shift.push_back(nbr_nurses_shift1);
        nurses_per_shift.push_back(nbr_nurses_shift2);
        nurses_per_shift.push_back(nbr_nurses_shift3);
        nurses_per_shift.push_back(nbr_nurses_shift4);
        nurses_per_shift.push_back(nbr_nurses_shift5);
        nurses_per_shift.push_back(nbr_nurses_shift6);
        nurses_per_shift.push_back(nbr_nurses_free);
        nbr_nurses_per_shift_per_day.push_back(nurses_per_shift);
    }
}

在这里你可以看到程序: Get_shift_assignment()和schedule_LD是其他名单。

void test_schedule_function()
{
    calculate_nbr_nurses_per_shift(schedule_LD);
    calculate_nbr_nurses_per_shift(get_shift_assignment());
    calculate_coverage_deficit();
}

完全理解问题需要的另一个功能是:

void calculate_coverage_deficit()
{
    int deficit = 0;

    for (int i = 0; i < get_nbr_days(); i++)
    {
        vector<int> deficit_day;

        for (int j = 0; j < get_nbr_shifts(); j++)
        {
            deficit = get_staffing_requirements()[j] - nbr_nurses_per_shift_per_day[i][j];
            deficit_day.push_back(deficit);
        }

        nurses_deficit.push_back(deficit_day);
    }

    cout << "Day 1, shift 1: there is a deficit of " << nurses_deficit[0][0] << " nurses." << endl;
    cout << "Day 1, shift 2: there is a deficit of " << nurses_deficit[0][1] << " nurses." << endl;
    cout << "Day 1, shift 3: there is a deficit of " << nurses_deficit[0][2] << " nurses." << endl;
    cout << "Day 1, shift 4: there is a deficit of " << nurses_deficit[0][3] << " nurses." << endl;
}

所以问题是,每次我运行这个程序时,它总是给我第一个名单的缺陷。在这种情况下,这是Schedule_LD。当我第一次使用输入名单get_shift_assignment()运行该函数时,他给了我那个名单的缺陷。 显然,第二次运行该函数时,nbr_nurses_per_shift_per_day [] []向量不会被覆盖,我不知道如何解决这个问题...非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

让我试着总结一下评论:

通过使用全局变量从函数返回值,您很可能在再次调用函数之前忘记从一个或多个全局变量中删除旧结果。

要解决此问题,请改为从函数返回结果。

例如:

vector<vector<int>> calculate_nbr_nurses_per_shift(vector<vector<int>> roster1)
{
  vector<int> nbr_nurses_per_shift_per_day; // Create the result vector

  ... // Do your calculations

  return nbr_nurses_per_shift_per_day;
}

或者如果您不想返回矢量:

void calculate_nbr_nurses_per_shift(vector<vector<int>> roster1, vector<vector<int>> nbr_nurses_per_shift_per_day)
{

  ... // Do your calculations

}

但很明显,第一个变体不容易出错(在第二个例子中你可以忘记再次清除nbr_of_nurses)并且大多数编译器会优化return nbr_nurses_per_shift_per_day因此不会复制整个向量。 / p>

第二个可能的问题是'get_nbr_days()'可能会返回大于或小于矢量实际大小的数字。要解决此问题,请使用size()的{​​{1}}方法或使用迭代器。

您的第一个功能将如下所示:

vector