存储矢量中的动态阵列
Storing dynamic array in vector
我必须显示学生成绩的直方图。我已经将成绩存储在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
,您正在向向量末端添加更多条目,这不是您想做的。
解决方案是
- 将此
vector<int> ptrV(grade_max, 0);
更改为此vector<int> ptrV;
,然后将电话保留给push_back
或 - 保持
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';
}
}
- 基于用户输入的 2D 动态阵列
- 2D 动态阵列被视为特洛伊木马?
- C 动态阵列在类中
- 将动态阵列中的字符与char进行比较
- C++ 清除动态阵列中的内存 - 内存无法清除
- 传递结构C 的动态阵列
- 结构的动态阵列
- 将指针或一系列指针存储在动态阵列中
- C 静态数组,例如动态阵列
- 指针的C 动态阵列
- 存储矢量中的动态阵列
- 动态阵列[C ]的驱动器
- C++动态阵列索引和容量问题
- 分段错误(核心转储)动态阵列
- C 排序字符串的动态阵列 - 排序不起作用
- 将一维动态阵列反转为n维
- 将指针添加到成员对象中的指针动态阵列
- MEMSET FUCTION在我的C 动态阵列初始化中不起作用
- C 填充动态阵列int
- 复制动态阵列并使用过载的操作员删除原件