我是C ++的初学者。我正在研究与预测财产财务相关的模型,我在设置数据结构时遇到了一些问题。
一些背景 - 我正在尝试的特定任务为关键数据结构设置类变量 - 一个名为PropFinance的结构。此结构将包含给定属性的所有关键信息(对其中的每个属性进行迭代),包括对未来性能的预测。传递给程序的两个主要参数是(适用于要评估的所有属性) (1)迭代次数(迭代次数) - 我们要生成预测的次数(随机迭代次数) (2)预测长度(NumofPeriods) - 我们预测的时间长度
PropFinance类中包含79个包含属性详细信息的变量。一个简单的例子 - 费用。对于费用,以及我喜欢的许多变量,我需要创建一个双重3D数组 - 每个迭代一个维度,每个预测期间一个维度。理想情况下,我会为费用增加一个变量:
class PropFinance {
double Expenses[Iterations][NumofPeriods];
}
但是,我在编译时不知道Iterations和NumofPeriods。我确实知道这两个变量在运行时开始时的值(对于当前程序执行的所有迭代/属性它们都是常量)
我的问题是如何在程序运行时动态更新这些数组的大小?基于我对该网站和其他网站的研究,似乎有两种主要方法可以实现这一目标
(1)使用 (2)在类定义中使用指针,然后使用new和delete来管理
但即使有这两个选项,我也不确定它是否适用于第三维(我看到的所有示例都只需要一个动态调整大小的维度)。有人可以发布口头解释或(更好)一个简单的代码示例,说明这将如何在上面的(1)或(2)中起作用?关于哪个选项更可取的任何指导都将受到赞赏(但不想开始“更好”的辩论)。当数组的大小不断变化时,矢量似乎更合适,而这种情况并非如此......
这个模型的总体速度至关重要,随着我们扩展迭代次数和属性,事情变得越来越快 - 所以我想尽可能高效地做事。
抱歉,我没有发布代码 - 如果人们无法辨别出我从上面提出的要求,我可以尝试将某些内容放在一起。
答案 0 :(得分:0)
惯用解决方案是避免直接堆分配C数组,并且更喜欢像std :: vector这样的STL容器,它以高效,可移植的方式自动处理调整大小,迭代和元素访问。我强烈推荐 Scott Meyers的Effective STL ,其中讨论了每个容器在不同应用中的适用性 - 插入/删除/检索复杂性gaurantees等。
答案 1 :(得分:0)
如果您需要超过2个维度(3,4,5等)。我知道最简单的解决方案是使用boost提供的multi_array。
如果您只需要二维数组,请使用vector
std::vector<std::vector<double> > Expenses;
由于您是初学者,最好从c ++提供的更高级别的组件开始,即使您熟悉c ++,也应该继续使用这些高级组件。当您需要开发时,可以使用c ++的基本元素。一些基础设施(矢量,列表,智能指针,线程等)。
#include <iostream>
#include <vector>
int main()
{
std::vector<std::vector<double> > expenses[10]; //contains 10 std::vector<double>
expenses[0].push_back(100);
std::cout<<expenses[0][0]<<std::endl;
expenses.push_back(std::vector<double>()); //now expenses has 11 std::vector<double>
return 0;
}
答案 2 :(得分:0)
我认为你正在接近面向对象的编程错误。
而不是让主类PropFinance
包含许多维数组中的所有内容。您是否考虑过像Iteration
这样的课程有多个Period
,例如
class Iteration
{
std::vector<Period> _periods;
}
class Period
{
public:
double Expense;
}
然后,当您添加更多维度时,您可以创建超类PropFinance
class PropFinance
{
std::vector<Iteration> _iterations;
}
这使得一切都更易于管理,而不是具有深度嵌套的数组[] [] [] []。根据经验,只要有多个维度数组,请考虑创建包含其他维度的子类。