如何将类的实例存储在向量中



我为一个有课程和成绩的学生做了一个班,程序一直要求新学生,直到名字停止。为了存储这些实例,我想使用向量,但除了先为实例创建一个数组,然后将它们推回到向量中之外,我没有找到任何其他方法来存储它们。是否可以为一个实例留出空间,并在使用后删除存储在Student Student中的值,以便重复使用?

int i=0;
Student student[20];
vector<Student> students;

cout << "Name?" << endl;
getline(cin,student[i].name);
while((student[i].name) != "stop")
{
student[i].addcoursegrade();
students.push_back(student[i]);
i++;
cout << "Name?" << endl;
getline(cin,student[i].name);
if((student[i].name) == "stop")
break;
};

我还在类中使用向量来存储课程和成绩的值,因为它们也应该在增长。类的代码在这里:

class Student {
public:
string name;
void print() {
cout << name ;
for (int i = 0; i < course.size(); i++)
cout << " - " << course[i] << " - " << grade[i];
cout<<endl;
}
void addcoursegrade() {
string coursee;
string gradee;
cout << "Course?" << endl;
getline(cin, coursee);
course.push_back(coursee);
while (coursee != "stop") {
cout << "Grade?" << endl;
getline(cin, gradee);
grade.push_back(gradee);
cout << "Course?" << endl;
getline(cin, coursee);
if (coursee != "stop")
course.push_back(coursee);
else if(coursee == "stop")
break;
}
};
private:
vector<string> course;
vector<string> grade;
};

与其创建一个数组然后进行回滚,只需保留一个实例并重新分配它:

Student student;
vector<Student> students;
cout << "Name?" << endl;
getline(cin,student.name);
while((student.name) != "stop")
{
student.addcoursegrade();
// this line copies the student in the vector
students.push_back(student);
// then, reassign the temp student to default values
student = {};
cout << "Name?" << endl;
getline(cin,student.name);
if((student.name) == "stop")
break;
};

有几件事困扰着我:

  • 循环的结构方式,复制getline。当终止输入出现时,我更喜欢while(true(带有break的数组
  • 不需要C样式数组。std::vector就是办法
  • 课程和年级的单独数组。相反,我更喜欢同时存储课程和成绩的单一记录
  • 循环中仅用于访问集合中的项的索引。(只需使用基于范围的for循环(
  • 除非需要,否则不要生成Student对象。使用局部变量进行字符串输入

与C++中的任何东西一样,还可以做更多的工作来改进它:比如为对象添加构造函数、用现代语法初始化、接受移动语义等。但我只是做了最小的更改。

我会这样处理:

#include <vector>
#include <string>
#include <iostream>
using namespace std;
struct CourseGrade {
string course;
string grade;
};
class Student {
public:
string name;
void print() {
cout << name;
for (auto& courseGrade : courseGrades) {
cout << " - " << courseGrade.course << " - " << courseGrade.grade;
}
cout << endl;
}
void addcoursegrades() {
while (true) {
cout << "Course?" << endl;
string course;
getline(cin, course);
if (course == "stop") break;
cout << "Grade?" << endl;
string grade;
getline(cin, grade);
CourseGrade courseGrade;
courseGrade.course = course;
courseGrade.grade = grade;
courseGrades.push_back(courseGrade);
}
}
private:
vector<CourseGrade> courseGrades;
};

int main() {
vector<Student> students;
while (true) {
cout << "Name?" << endl;
std::string name;
getline(cin, name);
if (name == "stop") break;
Student student;
student.name = name;
student.addcoursegrades();
students.push_back(student);
};
for (auto& student : students) {
student.print();
}
}

最新更新