动态向量大小分配

Dynamic Vector Size Allocation

我是 C++ 初学者。目前正在学习向量。我正在编写一个程序来计算给定成绩的平均值。我写的程序只接受5个等级。我如何修改程序,使矢量 space 自动分配给任意数量的年级?也就是说,在 'Enter grades:' 提示符下,我应该能够输入任意数量的成绩,并且必须计算这些成绩的平均值。

#include <iostream>
#include <vector>

using namespace std;

int main() {
    vector<int> grades;
    int grade;
    cout << "Enter grades: ";
    for(int i = 1; i <= 5; ++i) {
        cin >> grade;
        grades.push_back(grade);
    } double total = 0;
    for(int i = 0; i < grades.size(); ++i) {
        total += grades[i];
    } double avg;
      cout << "Average = " << total / grades.size() << endl;
    return 0;
}

您需要找出一个循环终止条件——让用户知道他已完成输入成绩的某种方式。一旦将其合并到 push_back 循环的边界中,您的代码就可以正常工作。假设您决定 -1 的成绩意味着用户已完成输入成绩。那么下面的修改就足够了:

while(cin >> grade and grade != -1)//EDITED
{
  grades.push_back(grade);
}

编辑:正如 cdhowie 提到的,您应该清理收到的输入。

向量非常酷,因为它们可以根据需要增长(如果您按原样使用 push_back 方法)。所以基本上,你已经在那里了!您的代码将处理尽可能多的成绩(在合理范围内)。

您需要更改的是将 for 循环更改为循环动态选择的次数:

变化:

for(int i = 1; i <= 5; ++i) {
    cin >> grade;
    grades.push_back(grade);
}

cout << "How many grades" << endl;
cin >> numOfGrades;
for(int i = 0; i < numOfGrades; ++i) {
    cin >> grade;
    grades.push_back(grade);
}

这将循环正确的次数并得到你想要的。

您似乎希望行尾(用户点击 "enter")表示成绩结束。

此代码会将整行拉入其 own stream object,这与 cin 不同 - 最终将 结束 .

std::string grades_full_line;
std::getline(std::cin, grades_full_line);           
std::stringstream grade_stream(grades_full_line);  

您现在可以更改循环以将流本身用作条件。当你到达终点时,它将评估为 false

for( grade_stream >> grade; grade_stream; grade_stream >> grade )
{      
  grades.push_back(grade);
}