存储矢量中的动态阵列

Storing dynamic array in vector

本文关键字:动态 阵列 存储      更新时间:2023-10-16

我必须显示学生成绩的直方图。我已经将成绩存储在Dyn。数组,但我的目标是将它们存储在向量中。正确的方法是什么?希望这是有道理的。

编辑:

我尝试使用向量

的尝试
void displayHistogram(int minGrade, vector<int> ptrV) {
cout << endl;
for (int i = 0; i <= minGrade; i++) {
    if (ptrV[i] != 0) {
        cout << "Number of " << i << "'s: " << ptrV[i] << endl;
    }
}
}
void histogram() {
int minGrade = 0, grade;
const int grade_max = 100;
vector<int> ptrV(grade_max, 0);
cout << "Enter the student's grades (-1 to stop entering): n";
do {
    cin >> grade;
    if (grade > minGrade) {
        minGrade = grade;
    }
    if (grade >= 0) {
        ptrV.push_back(grade);
    }
} while (grade != -1);
displayHistogram(minGrade, ptrV);
}

您的基本错误是您尝试强制向量,就好像它是一个原始数组一样。它为您做东西,让它。例如,它知道它的尺寸。您不需要

void displayHistogram(int minGrade, vector<int> ptrV) {
    cout << endl;
    for (int i = 0; i <= minGrade; i++) {

相反,您可以使用vector::size

void displayHistogram(vector<int> ptrV) {
    cout << endl;
    for (size_t i=0; i<ptrV.size(); i++) {

(甚至更好:void displayHistogram(const vector<int>& ptrV)表示在这里没有更改PTRV,并避免每次使用参考调用该功能时复制它。)

(如果您不使用i,因为它是等级,如果您有一个较新的编译器,我建议每个循环。它不是很少的情况。)

同样,您首先设置向量的大小然后增加它,这对我来说意味着您不信任它:

 vector<int> ptrV(grade_max, 0);

在这一点上,您有一个矢量,其中一百个条目全部为零。如果您需要一百个条目,则不需要稍后调整大小。vector::push_back调整它。但是请注意,将其设置为100的尺寸意味着[100]不是一个有效的位置,最后一个是[99],因为我们开始以零计数计数。您需要将其设置为101的大小,以使零和一百个作为有效地址。

我会将您的代码更改为:

const int grade_max = 100;
vector<int> ptrV(grade_max+1, 0); //changed it to +1 here as prtV[100] should be legal
cout << "Enter the student's grades (-1 to stop entering): n";
while (true)
{
    int grade; // put stuff in the smallest scope possible
    cin >> grade;
    if(grade == -1) break; // doing that here means we don't have to think about it anymore - the do while does it at last, I do it at first, handling all the special cases at the start and then assume I have the regular case.
    if(grade < 0 or grade > grade_max) continue; // continue jumps to the top of the most inner loop. Note that I make sure to catch illegal but possible input.
    ptrV[grade] += 1; // personal preference, I use ++ only to iterate
}
displayHistogram(ptrV);

我使用 while(true)重写了结构,我认为我这样做的方式更直观,但是会有一些人不同意它,也会写

之类的东西
if(grade == -1)
{
    break;
}

和一些很好的论点,主要是一个很好的练习程序,总是做牙套以避免错误。但是,我更喜欢一个衬里来降低详细的作用。

一个改进也将是告诉用户不良输入:

if(grade < 0 or grade > grade_max)
{
    cout << "Input not in valid range. Please choose number within 0 to " << grade_max << endl;
    continue;
}

现在,在这里要做的另一件事是离开程序部分。选择具有所有这些功能作为其中一部分的class GradeHistogram,被称为

GradeHistogram histogram;
histogram.take_input();
histogram.display();

但这是为了使您的代码工作时。

(我的答案更像是在CodeReview上找到的评论,但我认为这是您需要的而不是小修复。作品。)

,但我的目标是将它们存储在矢量中。

问题似乎是您已经对向量进行了尺寸以保存grade_max条目。但是,在填充向量时,您正在使用push_back。通过使用push_back,您正在向向量末端添加更多条目,这不是您想做的。

解决方案是

  1. 将此vector<int> ptrV(grade_max, 0);更改为此vector<int> ptrV;,然后将电话保留给push_back
  2. 保持vector<int> ptrV(grade_max, 0);,但仅使用ptrV[i] = grade;

如果您想显示的是直方图,那么最简单的事情就是使用 std::map从等级到级数。

类似的东西:

#include <iostream>
#include <map>
int main() {
    std::cout << "Enter the student's grades (-1 to stop entering): n";
    std::map<int, int> grades_map;
    int input_grade = -1;
    do {
        cin >> input_grade;
        if (input_grade > -1) {
            grades_map[input_grade]++;
        }
    } while (input_grade != -1);
    // Print histogram
    for (const auto& [grade, count] : grades_map) {
        std::cout << "Students with grade << grade << ": ";
        for (int i = 0; i < count; ++i) {
            std::cout << '*';
        }
        std::cout << 'n';
    }
}