【问题标题】:Printing Multidimensional Array C++打印多维数组 C++
【发布时间】:2019-03-15 02:26:06
【问题描述】:

如何打印出这个多维向量?我只是无法弄清楚在下面代码的打印部分的内部循环中要放置什么作为条件。我似乎无法弄清楚如何遍历数组来打印成绩。任何帮助将不胜感激。

#include <iostream>

using namespace std;

int main()
{
    int course, grades;

    int** crsgrd;
    // get inputs and asign grades
    cout << "Enter number of courses: ";
    cin >> course;
    crsgrd = new int * [course];
    for (int c = 0; c < course; c++) {
        cout << "Enter number of grades: ";
        cin >> grades;
        crsgrd[c] = new int[grades];
        for(int g = 0; g < grades; g++)  {
            cout << "Enter your grade: ";
            cin >> crsgrd[c][g];
        }
    }
    // print grade report
    for(int c = 0; c < course; c++) {
        for(int g = 0; g <= ?????????; g++)
            cout << crsgrd[c][g] << " ";
        cout << endl;
    }

    // free the array
    for(int i = 0; i < course; i++)
        delete [] crsgrd[i];
    delete [] crsgrd;

    return 0;
}

【问题讨论】:

  • g &lt; grades???
  • 顺便说一句,这是 C++,应该使用std::vector,这样他们就不必担心所有这些内存管理。
  • 看来是你造成了问题:cin &gt;&gt; grades; crsgrd[c] = new int[grades];。您邀请用户为每门课程给出不同数量的成绩,但您不存储成绩数量。有几种方法可以解决这个问题: 1. 您可以将等级数存储为每个向量中的第一个元素。 2. 你可以使用 std::vector<:vector>> courseGrades。你也可以想出其他方法。
  • 改进了@JohnMurray 对std::vectorstd::vectors 的建议:单个std::vector wrapped in a class 使其看起来像2D。这样可以将所有数据紧密结合在一起,当您这样做时,现代 CPU 喜欢它。它使预加载缓存变得非常容易。
  • @user4581301 假设第一门课程有 5 个成绩,第二门课程有 10 个成绩。您会创建一个 Matrix::reserve(size_t rows, size_t cols) 函数来为较长的行分配额外的空间,其中cols = max(到目前为止所有行的长度)?我同意将数据保存在一起比单独分配行更好,这会造成缓存噩梦。

标签: c++ arrays vector


【解决方案1】:

g

【讨论】:

  • crsgrd[c].size() 不是有效函数,因为 OP 对每一行都使用了标准的 c 样式数组。如果与对每一行使用 std::array 结合使用,这将是完美的解决方案。
【解决方案2】:

您创建了一个二维数组,而不是标准向量。数组不存储它们的长度,所以你要么想出一种方法来存储长度,要么切换到另一种类型的存储容器。

下面是一个示例,它将成绩的数量存储为给定课程的数组的第一个元素:

#include <iostream>

using namespace std;

int main()
{
  int course, grades;

  int** crsgrd;
  // get inputs and asign grades
  cout << "Enter number of courses: ";
  cin >> course;
  crsgrd = new int * [course];
  for (int c = 0; c < course; c++) {
    cout << "Enter number of grades: ";
    cin >> grades;
    crsgrd[c] = new int[grades + 1];  // extra cell for # of grades
    crsgrd[c][0] = grades;
    // start storing grades at cell [c][1] as the first cell has the length
    for(int g = 1; g < grades+1; g++)  {
      cout << "Enter your grade: ";
      cin >> crsgrd[c][g];
    }
  }
  // print grade report
  for(int c = 0; c < course; c++) {
    cout<< "Course #" << c+1 << " grades:" << endl;

    // use first element as limit for for loop.
    // Be sure to print one more element as we have an extra cell 
    // at the end.
    for(int g = 1; g < crsgrd[c][0] + 1; g++) 
       cout << crsgrd[c][g] << " ";
       cout << endl;
  }

  // free the array
  for(int i = 0; i < course; i++)
    delete [] crsgrd[i];
  delete [] crsgrd;

  return 0;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-30
    相关资源
    最近更新 更多