C++ C++;无STL的动态数组

C++ C++;无STL的动态数组,c++,arrays,C++,Arrays,这是作业的一部分,但我只是要求澄清: 从ATM.txt加载数据并将其存储在动态数组中(ATM类型, 当程序启动时,不是STL 在没有STL的情况下,如何准确地创建动态数组?我想也许这个作业意味着使用指针,“自动取款机类型”把我甩了 再次提到: 将accounts.txt文件放入动态数组(帐户类型,而不是STL) --不是任务的一部分 我从未理解过使用内存不安全操作,例如从第一行提取文件中的项目数: 例如 使用STL(vectors,或C++11数组)而不依赖文件中的数字不是更明智吗,因为它可能不

这是作业的一部分,但我只是要求澄清:

从ATM.txt加载数据并将其存储在动态数组中(ATM类型, 当程序启动时,不是STL

在没有STL的情况下,如何准确地创建动态数组?我想也许这个作业意味着使用指针,“自动取款机类型”把我甩了

再次提到:

将accounts.txt文件放入动态数组(帐户类型,而不是STL)

--不是任务的一部分

我从未理解过使用内存不安全操作,例如从第一行提取文件中的项目数:

例如


使用STL(vectors,或C++11数组)而不依赖文件中的数字不是更明智吗,因为它可能不准确,从而导致缓冲区溢出等

//编辑 在Account.h文件中定义一个类帐户,该文件包含以下数据成员:customer id、BSB编号等


我假设Account和ATM类型就是这些类。

这种分配的常见方法是自己模拟向量的自动扩展行为。为堆上的数据分配一个数组,并跟踪其长度和存储在数组中的项数


用数据填充数组后,将最大大小扩大一部分,然后分配一个新数组。这允许您将数据从旧数组复制到新数组中,然后继续添加项,直到空间再次耗尽。

基本上,如果需要在不使用STL的情况下实现动态数组,则必须明确处理内存分配/释放

基本上,你必须:

  • 第一次构造或使用数组时使用malloc分配空间
  • 跟踪插入/删除的元素
  • 完成分配的空间后使用realloc
  • 销毁阵列时释放分配的空间
当然,实现一个好的类似STL的容器,比如std::vector并不是一件容易的任务(最终是一个很好的作业!)

我可以提出以下建议:

  • 尽可能避免重新分配。当空间完成时,分配更多的空间以避免继续调用realloc(请参阅std::vector::reserve)
  • 移除元素时,避免重新锁定空间。一旦分配完,除非内存使用率太高,否则就让分配的空间保持原样,以避免将来重新分配

使用STL(向量或C++11数组)而不是 依赖文件中的数字,因为它可能不准确 缓冲区溢出等

std::vector的内部结构并不神奇。可以像std::vector为您所做的那样手动执行


听起来这就是你在这项任务中应该做的;制作您自己的“ATM类型”,可以管理从ATM.txt文件安全读取数据,以及可以保存accounts.txt文件数据的“帐户类型”。你可能会从写作业的人那里得到一些关于他们期望如何设计/使用这些类型的澄清。回顾一下你所掌握的任何课程材料,你都应该知道使用动态数组需要知道什么。

动态数组最基本的形式是使用
new[]
创建,然后使用
delete[]
销毁:

ATM * atms = new ATM[count];
// do stuff with the array
delete [] atms;
但是,这带来了使用数组的代码可能引发异常、从函数返回或以其他方式阻止
delete[]
发生的危险。如果发生这种情况,那么您将丢失指向已分配内存的唯一指针,它将保持已分配但无法访问;这称为内存泄漏。因此,最好将数组封装在类中,并使用:

  • 成员变量来存储指向数组的指针,以及(可选)其大小
  • 用于分配数组的构造函数和/或函数
  • 用于删除数组的析构函数
  • (可选)用于调整阵列大小的函数
删除对象析构函数中的分配时,使用的原则是确保数组不再需要时被删除

这就留下了另一个危险:如果复制这个数组对象,那么最终将得到两个对象,它们都试图删除同一个数组,这是灾难性的。为了防止这种情况,你需要考虑。要么编写复制构造函数和复制赋值操作符来分配新数组并复制内容;或者删除它们。(如果你学习的是过时的C++,那么你不能删除成员函数,所以你必须声明它们是私有的,而不是实现它们。”
使用STL不是更聪明吗


通常是的。但是如果你正在学习C++,那么理解内存管理是如何工作的,以及如何让库处理你的内存是一个好主意。这可能是本练习的一部分内容。

由于这是家庭作业,我们不想直接给出答案,但总体而言,我建议:

  • 让我的卡雷成为一个班级
  • 使类包含int或long以存储数组大小
  • 使用“新建”为阵列分配内存。从作业来看,它可能是一个字符串数组,或者,如果教授严格禁止STL(字符串现在被认为是STL),它将是一个字符数组数组
  • 编写一个insert方法,在插入之前检查数组的大小(请参见#2),如果数组不够大,则将其变大。这样做的一种方法,而不使用前C ++函数,我认为这是最好的,因为这是C++类,是分配一个较大数组的新数组> >从旧数组复制数据> >插入任何新数据。多大?你可以选择,比如说,每增加一次分配,就增加20%。微软的C#分配“第二大素数”的元素,尽管它们有非常快速的内存分配例程
  • 完成动态数组时,不要忘记删除()它(什么“
    ATM * atms = new ATM[count];
    // do stuff with the array
    delete [] atms;