【问题标题】:Vector cannot be overwritten矢量不能被覆盖
【发布时间】:2013-12-14 13:43:27
【问题描述】:

我正在努力编写大学计划。该计划的目标是为医院制定护士时间表。但是,我真的被困在此刻。下面可以找到程序的一个功能。

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

该函数应该计算每天有多少护士被安排在某个班次。例如,第一天有 8 名护士执行 2 班、6 班 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_shive_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[][] 向量在我第二次运行该函数时没有被覆盖,我不知道如何解决这个问题......任何帮助将不胜感激。

【问题讨论】:

  • 次要注意:在 void calculate_nbr_nurses_per_shift(vector> roster1) 中,您应该将 roster1 作为 const& 传递,而不是按值传递。
  • 您的代码中似乎使用了很多全局变量。我的假设是,在使用该向量调用函数之前,您需要 clear 一个或多个向量(例如,nurses_per_shift.clear()calculate_nbr_nurses_per_shift 之前)
  • 您是在两次通话之间清除calculate_nbr_nurses_per_shift,还是应该在calculate_nbr_nurses_per_shift 中清除它?你说它没有被覆盖,函数原样将所有数据推到一个稳定增长的向量的末端。
  • 正如@RichardPlunkett 所说,您将新数据添加到向量的end,并且您只从开始 读取数据,所以你只需要看看是第一个花名册。
  • @user1781290 更好的是实际从函数返回向量,而不是为此依赖全局变量。很明显,thr OP 错过了编写返回值的函数的课程(对于新手来说这很常见)。

标签: c++ vector scheduling overwrite


【解决方案1】:

让我试着总结一下cmets:

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

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

例如:

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,因此不会复制整个向量。

第二个可能的问题是“get_nbr_days()”可能返回大于或小于向量实际大小的数字。要解决此问题,请使用vectorsize() 方法或改用迭代器。

您的第一个函数将如下所示:

vector<vector<int>> calculate_nbr_nurses_per_shift(vector<vector<int>> roster1)
{
  vector<vector<int>> nbr_nurses_per_shift_per_day;
  for (vector<vector<int>>::iterator shiftsOnDay = roster1.begin(); shiftsOnDay != roster1.end(); ++shiftsOnDay)
  {
    vector<int> nurses_per_shift(6, 0); // Create vector with 6 elements initialized to 0
    for (vector<int>::iterator shift = shiftsOnDay->begin(); shift != shiftsOnDay->end(); ++shift)
    {
      if (*shift == 0)
        nurses_per_shift[5]++;
      else
        nurses_per_shift[*shift - 1]++; // This code relies on shift only containing meaningful values
    }
    nbr_nurses_per_shift_per_day.push_back(nurses_per_shift);
  }
  return nbr_nurses_per_shift_per_day;
}

【讨论】:

  • 哇,没想到这么短的时间会有这么多答案:) 非常感谢大家。多亏了你,我知道我做错了什么,现在问题已经解决了。并不是我不知道如何编写返回值的函数,而是我确实是 C++ 新手。我们没有任何关于如何开始编程和 C++ 的课程,我们应该自己学习。这就是为什么像这样的网站和像你这样的人如此受欢迎的原因。再次感谢您的大力帮助:)
猜你喜欢
  • 1970-01-01
  • 2019-12-04
  • 2021-07-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多