C ++中类中的多维动态数组

时间:2013-04-29 19:06:23

标签: c++ class vector new-operator dynamic-arrays

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

一些背景 - 我正在尝试的特定任务为关键数据结构设置类变量 - 一个名为PropFinance的结构。此结构将包含给定属性的所有关键信息(对其中的每个属性进行迭代),包括对未来性能的预测。传递给程序的两个主要参数是(适用于要评估的所有属性)     (1)迭代次数(迭代次数) - 我们要生成预测的次数(随机迭代次数)     (2)预测长度(NumofPeriods) - 我们预测的时间长度

PropFinance类中包含79个包含属性详细信息的变量。一个简单的例子 - 费用。对于费用,以及我喜欢的许多变量,我需要创建一个双重3D数组 - 每个迭代一个维度,每个预测期间一个维度。理想情况下,我会为费用增加一个变量:

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

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

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

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

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

这个模型的总体速度至关重要,随着我们扩展迭代次数和属性,事情变得越来越快 - 所以我想尽可能高效地做事。

抱歉,我没有发布代码 - 如果人们无法辨别出我从上面提出的要求,我可以尝试将某些内容放在一起。

3 个答案:

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

how to use vector

multi array

答案 2 :(得分:0)

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

而不是让主类PropFinance包含许多维数组中的所有内容。您是否考虑过像Iteration这样的课程有多个Period,例如

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

class Period
{
public:
  double Expense;
}

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

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

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