如何在向量中存储 class 的实例?
How to store an instance of class in a vector?
我已经为一个有课程和成绩的学生创建了 class,该程序一直在询问新学生,直到停止给定的名字。为了存储这些实例,我想使用向量,但除了先为实例创建一个数组然后将它们推回向量之外,我没有找到任何其他方法来存储它们。
是否可以留出一个实例空间,使用后删除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 中使用向量来存储课程和成绩的值,因为它们也应该在增长。 class 的代码在这里:
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) 数组,在出现终止输入时中断。
- 不需要 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();
}
}
我已经为一个有课程和成绩的学生创建了 class,该程序一直在询问新学生,直到停止给定的名字。为了存储这些实例,我想使用向量,但除了先为实例创建一个数组然后将它们推回向量之外,我没有找到任何其他方法来存储它们。 是否可以留出一个实例空间,使用后删除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 中使用向量来存储课程和成绩的值,因为它们也应该在增长。 class 的代码在这里:
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) 数组,在出现终止输入时中断。 - 不需要 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();
}
}