2013-04-29 92 views
1

我是C++的相對初學者。我正在研究與預測財產財務相關的模型,並且我有幾個問題正在獲取我的數據結構設置。C++中的多維動態數組類

有點背景 - 我想要做的具體任務是爲關鍵數據結構設置類變量 - 一種叫做PropFinance的結構。這種結構將把我所有的關鍵信息放在一個給定的屬性上(對它們集合中的每個屬性進行迭代),包括對未來性能的預測。 (1)迭代次數(Iterations) - 我們要產生預測的次數(隨機迭代) (2)長度的預測(NumofPeriods) - 我們要預測多少個週期

PropFinance類在其中包含79個變量,其中包含屬性詳細信息。一個簡單的例子 - 費用。對於開支和許多我喜歡的變量,我需要創建一個3D數組 - 每個迭代一個維度,每個預測時間段一個維度。所以,理想情況下,我想有一個變量的費用:

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

,但我不知道在編譯時迭代和NumofPeriods。我知道運行時開始這兩個變量的值(並且它們對於當前程序執行的所有迭代/屬性都是恆定的)

我的問題是如何在這些數組的大小被動態更新時該程序運行?根據我在這個網站和其它方面的研究,這似乎是兩個主要的方法來做到這一點是

(1)使用 (2)使用指針的類定義,然後使用new和delete管理

但即使有了這兩個選項,我也不確定它是否能夠在第三維上工作(我看到的所有示例都需要動態調整一個維度)。有人可能會發表一個口頭解釋或(更好)一個簡單的代碼示例,說明如何在上面的(1)或(2)中工作?任何指導哪個選項是可取的,我們將不勝感激(但不想開始「什麼更好」的辯論)。當陣列的大小將不斷變化時,似乎向量更合適...

該模型的整體速度至關重要,並且隨着我們擴展迭代次數以及屬性事物迅速變大 - 所以我想盡可能有效地做事。

對不起,我沒有發佈代碼 - 如果人們無法辨別我從上面提出的問題,我可以嘗試將某些東西放在一起。

回答

0

這種慣用的解決方案是爲了避免直接堆分配C數組,並且喜歡使用像std :: vector這樣的STL容器,它能夠以高效,便攜的方式自動處理調整大小,迭代和元素訪問。我強烈建議斯科特邁爾斯的有效STL,其中談到每個容器適用於不同的應用程序 - 插入/刪除/檢索複雜gaurantees等

+0

謝謝!我想澄清一下,vector是一個高效的選項 - 如果我預先聲明瞭這些數組(不考慮編譯時信息問題),那麼總體上來說動態地重新調整數組數千次的速度並不快得多?如果我預測了180次25次迭代(平均大小的運行),那麼我將有效地重新排列陣列4500次。這兩種選擇之間沒有太多的性能差異?對於我這個無知的問題抱歉 - 我知道在「事前大小」的情況下,我仍然需要做4,500個任務,所以也許不會太慢? – brentf 2013-04-29 19:43:30

+0

只有你知道週期和迭代次數,你可以用std :: vector :: reserve(size_t)預先分配向量。該函數將容器的容量設置爲期望的數量,以便在執行push_back時避免重新分配。 – ilmale 2013-04-29 20:03:37

+0

這很有道理 - 謝謝你的澄清。 – brentf 2013-04-29 20:14:02

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

how to use vector

multi array

+0

感謝您的快速回復 - 聽起來像矢量是現在的方式(除非我超出了兩個維度)。我將在我的解決方案上工作,稍後再發布一些代碼。只是爲了澄清 - 一旦我已經聲明矢量,我只是使用push_back來分配它們? – brentf 2013-04-29 19:36:03

0

我覺得你在接近面向對象的編程錯誤。

而不是主類PropFinance與許多維數組中的所有內容。您是否考慮過像Iteration具有多個Period

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

class Period 
{ 
public: 
    double Expense; 
} 

然後爲你增加更多的維度,您可以創建超類PropFinance

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

這使得一切更易於管理,而不必深嵌套數組類[] [] [] []。根據經驗,無論何時您有多個維度數組,都應考慮創建包含其他維度的子類。