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[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