C++ 动态数组的矢量存储

C++ 动态数组的矢量存储,c++,C++,我必须显示学生成绩的柱状图。我把成绩储存在数据库里了。数组,但我的目标是将它们存储在向量中。正确的做法是什么?希望这是有意义的 编辑: 我尝试使用向量 void displayHistogram(int minGrade, vector<int> ptrV) { cout << endl; for (int i = 0; i <= minGrade; i++) { if (ptrV[i] != 0) { cout << "Num

我必须显示学生成绩的柱状图。我把成绩储存在数据库里了。数组,但我的目标是将它们存储在向量中。正确的做法是什么?希望这是有意义的

编辑:

我尝试使用向量

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显示直方图(int-minGrade,向量ptrV){
库特
但我的目标是将它们存储在一个向量中

问题似乎是您已经调整了向量的大小,以容纳
grade\u max
条目。但是,在填充向量时,您正在使用
push\u back
。通过使用
push\u back
,您正在向向量末尾添加更多条目,这不是您想要做的

解决办法是

  • 将此
    vector ptrV(grade_max,0);
    更改为此
    vector ptrV;
    并将对
    push_-back的调用保持为单独,或
  • 保持向量ptrV(grade_max,0);
  • 但只使用
    ptrV[i]=grade;
    但我的目标是将它们存储在一个向量中

    问题似乎是您已经调整了向量的大小,以容纳
    grade\u max
    条目。但是,在填充向量时,您正在使用
    push\u back
    。通过使用
    push\u back
    ,您正在向向量末尾添加更多条目,这不是您想要做的

    解决办法是

  • 将此
    vector ptrV(grade_max,0);
    更改为此
    vector ptrV;
    并将对
    push_-back的调用保持为单独,或
  • 保持向量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';
        }
    }
    
    #包括
    #包括
    int main(){
    标准::cout>输入\等级;
    如果(输入等级>-1){
    等级映射[输入等级]+;
    }
    }while(输入_等级!=-1);
    //打印直方图
    对于(常数自动和[坡度,计数]:坡度\u地图){
    
    std::cout如果要显示的是直方图,那么最简单的方法是使用
    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';
        }
    }
    
    #包括
    #包括
    int main(){
    标准::cout>输入\等级;
    如果(输入等级>-1){
    等级映射[输入等级]+;
    }
    }while(输入_等级!=-1);
    //打印直方图
    对于(常数自动和[坡度,计数]:坡度\u地图){
    
    std::cout你的基本错误是你试图强制向量,就好像它是一个原始数组一样。它为你做事情,让它做。例如,它知道它的大小。你不需要

    void displayHistogram(int minGrade, vector<int> ptrV) {
    
        cout << endl;
        for (int i = 0; i <= minGrade; i++) {
    
    (更好的是:
    void displaythistogram(const vector&ptrV)
    表示ptrV在这里没有更改,并避免每次使用引用调用函数时复制它。)

    (如果你不使用
    i
    ,因为它是一个等级,如果你有一个更新的编译器,我会推荐一个for-each循环。这通常是一种方法,碰巧你有一个罕见的情况,它不是。)

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

     vector<int> ptrV(grade_max, 0);
    
    我用
    重写了这个结构,而(真的)
    ,我认为我这样做更直观,但是会有人不同意,他们也会这样写

    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;
    }
    
    但这是为了让代码正常工作


    (我的答案更像是在上找到的评论,但我认为这是您需要的,而不是小的修复。顺便说一句,这是我只能建议您在代码正常工作后安装的东西。)

    你的基本错误是,你试图强制向量就像它是一个原始数组一样。它为你做事情,让它做。例如,它知道它的大小。你不需要

    void displayHistogram(int minGrade, vector<int> ptrV) {
    
        cout << endl;
        for (int i = 0; i <= minGrade; i++) {
    
    (更好的是:
    void displaythistogram(const vector&ptrV)
    表示ptrV在这里没有更改,并避免每次使用引用调用函数时复制它。)

    (如果你不使用
    i
    ,因为它是一个等级,如果你有一个更新的编译器,我会推荐一个for-each循环。这通常是一种方法,碰巧你有一个罕见的情况,它不是。)

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

     vector<int> ptrV(grade_max, 0);
    
    我用
    重写了这个结构,而(真的)
    ,我认为我这样做更直观,但是会有人不同意,他们也会这样写

    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;
    }
    
    但这是为了让代码正常工作


    (我的答案更像是在上找到的评论,但我认为这是您需要的,而不是小的修复。顺便说一句,这是我只能建议您在代码正常工作后安装的东西。)

    代码现在可以工作了吗?如果可以,您是否尝试过将
    int*ptr;
    更改为
    std::vector ptr;
    并从那里开始?如果可以,您遇到了什么问题和/或错误?(我需要问,因为此代码审查问题应该转到[StackExchange代码审查]()OT.:
    do
    while()
    在您的情况下有点不走运。为什么不
    而((cin>>等级)和(&&(等级>=0))
    可以像数组一样使用,并且有很多附加选项。其中一些选项是:可以用特定的大小初始化,默认值(对于您的情况足够)可以是initia