使用动态分配创建数组并在其中插入元素

时间:2017-05-12 08:27:19

标签: c++ arrays dynamic allocation

我想将图书馆管理系统作为作业

class student
{
          char ID_number[30];
          char Student_name[30];
      public:
          void create_student()
          {
                    cout<<"\nEnter The ID Number ";
                    cin>>ID_number;
                    cout<<"\n\nEnter The Name of The Student: ";
                    cin>>Student_name;

                    cout<<"\n\nStudent Created Successfully"<<endl;
          }
          void show_student()
          {
                    cout<<"\nID Number: "<<ID_number;
                    cout<<"\nStudent Name: ";
                    cin.getline(Student_name,30);


          }

我如何使用动态分配使每个新条目进入数组并使用指针显示某个学生?

我非常擅长这个特殊的部分,提前谢谢!

3 个答案:

答案 0 :(得分:1)

由于您使用C ++进行编码,而不是使用C语言,我建议使用字符串 class ,如std::string,而不是原始char数组,例如:< / p>

std::string student_name;

如果您想将学生列表存储在内存中,我建议使用std::vector容器,例如:

std::vector<Student> students;

您可以使用vector::push_back方法将新学生添加到容器中。

编辑如果您想使用new[]delete[]作为学习练习,您可以分配大量学生,然后在数组中使用整数索引,指向插入新学生的第一个免费插槽。 E.g:

int capacity = 100;
Student* students = new Student[capacity];

int student_count = 0;

要添加新学生,请将其复制到student_count给出的数组索引中,然后将此变量递增1,指向预分配数组中的下一个空闲插槽。

你必须注意溢出数组的容量。预分配阵列已满后,如果要添加新学生,则需要分配容量更大的新阵列。您可以使用2x或1.5x比例因子来计算新容量。

不要忘记释放先前使用delete[]分配的内存。

如果你这样做,你基本上是从头开始实现std::vector(即使这个标准容器还有其他高级功能,比如移动语义等)。

答案 1 :(得分:0)

如果您需要std::vector<student>,请

std::vector<student*>pointer

添加新学生:

Student* newStudent = new Student(name);

vector.append(newStudent);

读取名为“Victor”的学生,然后将其删除:

Student* victor;
for(int i = 0; i<vector.size();i++) {
    if(vector.at(i)->getName() == "Victor") {
        victor = vector.at(i);
        break;
    }
 }
//Then you can delete it
delete(victor);

std::vector

答案 2 :(得分:0)

如果动态,你的意思是你想创造一些&#34;一些&#34; stduent记录,但不确定你有多少人不需要担心新的或删除。只需使用矢量。

std::vector<student> students;
while(!bored)
{
    student latest;
    latest.creat_student(); // this looks a bit odd, perhaps it should be a free function...
    vector.push_back(latest);
    //TODO - see if I am bored yet
}

现在我们有学生。你说你想使用指针来显示它们。或者说是某个学生。你还没有描述如何选择某个学生&#34;所以让我们先向他们展示

for (auto item : students)
{
    item.show_student();
}

令人失望的是,您的show_student方法未被声明为const,您应该考虑这一点。

要为特定学生编制索引,您可以使用students[17]。或者你想要的索引。如果您提供获取属性的方法(当然可以考虑使用std::string代替char *)find学生>

如果你真的想要使用student的原始数组,那么这样的东西可以工作,但如果5或者你选择的任何东西都不够,你会进入reallocs等。这是选择std::vector

的一个令人信服的理由
student * them = new student[5];
for (size_t i = 0; i < 5; ++i)
{
    student latest;
    latest.create_student();
    them[i] = latest;
}

for (size_t i = 0; i < 5; ++i)
{
    them[i].show_student();
}
delete[] them;