1

我是 C++ 的相对初学者。我正在研究与预测财产财务相关的模型,并且在设置数据结构时遇到了一些问题。

一些背景知识——我正在尝试为关键数据结构设置类变量的具体任务——一种称为 PropFinance 的结构。这个结构将包含我关于给定属性的所有关键信息(在它们的集合中对每个属性进行迭代),包括对未来性能的预测。传递给程序的两个主要参数是(适用于所有要评估的属性)(1)迭代次数(Iterations) - 我们将生成多少次预测(随机迭代)(2)预测长度(NumofPeriods) - 我们要预测多少个周期

PropFinance 类中有 79 个变量,其中包含属性详细信息。一个简单的例子——费用。对于费用以及我的许多类似变量,我将需要创建一个双精度的 3D 数组 - 每次迭代一个维度,每个预测期一个维度。因此,理想情况下,我将有一个用于费用的变量:

class PropFinance {
    double Expenses[Iterations][NumofPeriods];
}

但是,我在编译时不知道 Iterations 和 NumofPeriods。我确实知道这两个变量在运行时开始时的值(并且它们对于当前程序执行的所有迭代/属性都是恒定的)

我的问题是如何在程序运行时动态更新这些数组的大小?根据我对这个网站和其他网站的研究,似乎实现这一目标的两种主要方法是

(1) 使用 (2) 在类定义中使用指针然后使用new和delete来管理

但即使有这两个选项,我也不确定它是否适用于第三个维度(我看到的所有示例都只需要一个维度来动态调整大小)。有人可以发布一个口头解释或(更好)一个简单的代码示例,说明这将如何在上面的(1)或(2)中工作?任何关于哪个选项更可取的指导将不胜感激(但不想开始“什么更好”的辩论)。当数组的大小将不断变化时,似乎 vector 更合适,而这里的情况并非如此......

这个模型的整体速度至关重要,随着我们扩大迭代和属性的数量,事情很快就会变大——所以我想尽可能高效地做事情。

抱歉,我没有发布代码 - 如果人们无法从上面辨别我在问什么,我可以尝试将一些东西放在一起。

4

3 回答 3

0

惯用的解决方案是避免 C 数组的直接堆分配,并更喜欢像 std::vector 这样的 STL 容器,它以高效、可移植的方式自动处理大小调整、迭代和元素访问。我强烈推荐Scott Meyers 的 Effective STL,它讨论了每个容器对不同应用程序的适用性 - 插入/删除/检索复杂性保证等。

于 2013-04-29T19:10:43.887 回答
0

如果您需要超过 2 个维度(3、4、5 等)。我知道的最简单的解决方案是使用 boost 提供的 multi_array。

如果只需要二维数组,请使用向量

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

如何使用矢量

多阵列

于 2013-04-29T19:11:40.950 回答
0

我认为您正在接近面向对象的编程错误。

PropFinance而不是拥有一个包含多维数组中所有内容的大师班。你有没有考虑过Iteration有多个课程,Period比如

class Iteration  
{
  std::vector<Period­> _periods;  
}

class Period
{
public:
  double Expense;
}

然后,当您添加更多维度时,您可以创建超类PropFinance

class PropFinance
{
  std::vector<Iteration> _iterations;
}

这使得一切都更易于管理,而不是深度嵌套的数组 [][][][]。根据经验,只要您有多个维度数组,请考虑创建包含另一个维度的子类。

于 2013-04-30T05:02:52.900 回答