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

Posted

技术标签:

【中文标题】使用动态分配创建数组并将元素插入其中【英文标题】:Using dynamic allocation to create an array and insert elements into it 【发布时间】:2017-05-12 08:27:19 【问题描述】:

我想做一个图书馆管理系统作为作业

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);


          

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

我在这方面真的很糟糕,提前谢谢!

【问题讨论】:

您可以使用std::vector&lt;student&gt; 很遗憾,对于这个分配,我只能使用动态分配,我想我可以做到,但不能不列出特定的数组大小 vector 提供动态分配。你不需要指定它的大小 所以写你自己的vector 抱歉我不是很清楚,我需要使用 new[] 和 delete[] 而不是向量 【参考方案1】:

由于您使用 C++ 而不是 C 进行编码,因此我建议您使用字符串 class,例如 std::string,而不是原始的 char 数组,例如:

std::string student_name;

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

std::vector<Student> students;

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


编辑如果你想使用new[]delete[]作为学习练习,你可以分配一个大的学生数组,然后在数组内使用一个整数索引,指向第一个用于插入新学生的空闲插槽。 例如:

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

int student_count = 0;

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

一定要注意不要溢出数组的容量。一旦预先分配的数组已满,如果要添加一个新学生,则需要分配一个容量更大的新数组。您可以使用 2 倍或 1.5 倍的比例因子来计算新容量。

别忘了释放之前用delete[]分配的内存。

如果你这样做,你基本上是从零开始实现std::vector(即使这个标准容器有额外的高级特性,比如移动语义等)。

【讨论】:

但是字符串不会让它在空格之后读取超过一个单词吗?如果我使用字符串和 cin>>student_name,我希望它读取整行字符,即“john doe”;它只会得到“约翰”而忽略其余部分而且我只能在这个作业中使用动态分配,实际上这就是作业的重点。编辑:要清楚我需要使用 new[] 和 delete[] 没有向量 @00qq00:好问题。使用getline(cin, student_name); 谢谢这个作品!知道如何使用 new[] delete[] 代替向量吗? 谢谢,我去试试【参考方案2】:

如果通过动态您的意思是您想要创建“一些”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

现在我们有学生了。你说你想用指针来显示它们。或者说是某个学生。你还没有描述你将如何选择“某个学生”,所以让我们先展示一下

for (auto item : students)

    item.show_student();

令人失望的是,您的 show_student 方法没有声明为 const,您应该考虑一下。

要索引特定学生,您可以使用students[17]。或者你想要哪个索引。如果您提供一种获取属性的方法(当然可以考虑使用std::string 而不是char *),您也许可以对具有特定属性的find 学生使用std 算法


如果你真的想使用 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;

【讨论】:

好的,所以对于 new 和 delete,我每次都必须声明我的数组的大小? 完全正确 - 刚刚添加了一个编辑。 Vector 会为您处理这个问题,并在需要时重新分配。如果您使用原始数组,则需要自己执行此操作。【参考方案3】:

std::vector&lt;student&gt;std::vector&lt;student*&gt; 如果你想要 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

【讨论】:

我只能使用 new[] 和 delete[] 所以有什么想法如何以及在哪里插入它们? 我不知道你说的 new 和 delete 是什么意思。 public: void * operator new[] (size_t) return 0; void operator delete[] (void*) ; int main() MyClass *pMyClass = new MyClass[5];删除 [] pMyClass; 我需要使用这样的东西 如果你坚持使用 c 风格的数组,那会行得通,为什么要定义你自己的? 是学生练习吗?如果是@Mr.C64 比我的好。

以上是关于使用动态分配创建数组并将元素插入其中的主要内容,如果未能解决你的问题,请参考以下文章

C++简单实现vector

指针数组的动态内存分配

为啥必须动态分配扩展数组才能使此函数正常工作 C++

如何复制动态分配的对象(具有一个类的 const 成员)

Qt中的2D游戏:初始化怪物并将动态分配的数组作为指针参数传递[关闭]

线性表的动态内存分配顺序存储结构