簡體   English   中英

多維數組作為要在堆上分配的類成員

[英]Multi-dimensional array as a class member to be allocated on the heap

我正在為我的學士學位論文編寫模擬程序,但我不是C ++專家,並且在搜索了相當長的時間之后,沒有找到方便的答案或問題,因此我求助於你們。

我的問題如下。 我有一個類,除了可以存儲在堆棧中的其他成員字段num_a ,還有幾個成員字段num_anum_b 現在,這兩個值的大小大約為1000-2000。 我現在需要的是SampleClass另一個類成員,即大小為num_a * num_b數組。 由於其大小,需要在堆上分配它。 它必須在內存中是連續的,因此對我而言,存儲指向數組的指針的指針不起作用。

SampleClass : Object {
   public:
         uint16_t num_a;
         uint16_t num_b;
         ??? // some data structure for my 2d array

         // simple constructor
         SampleClass(num_a, num_b);

}

我在頭文件.h聲明我的類,並在源文件.cc實現函數和構造函數。

如您所見, num_anum_b的值num_b是預先確定的,因此不是const 我的問題是,如何(以一種簡單的方式)在頭文件中聲明此內容,以及如何在源文件的構造函數中對其進行初始化?

我發現使用vector的東西如下:

// header file
std::vector<std::vector<bool>> *coverage_matrix;

// source file
coverage_matrix = new std::vector<std::vector<bool>>();
coverage_matrix->push_back(something); // do something with it

最后一種方法是否有效,更重要的是,它是否像不依賴std::vector的解決方案一樣有效?

感謝您的回答。

大小為num_a * num_b的二維數組...由於其大小,需要在堆上分配它。 它必須在內存中是連續的

 std::vector<std::vector<bool>> 

在向量的向量中,行在它們內部是連續的,但彼此之間不是相互關聯的。 這與指針數組相同。 因此,這不能滿足您對連續布局的需求。

  new std::vector<std::vector<bool>>() 

幾乎沒有必要像這樣動態分配向量。 最好避免使用,以確保正確性和性能。


分配動態大小的連續數組的唯一解決方案是分配一維數組,其中各行之間是平坦的。 例如:

std::vector<bool> matrix(num_a * num_b);

您可以在索引a + num_a * b處訪問元素[a] [b]。


注意std::vector<bool>是非常特殊的,並且與其他向量不同。 它不包含任何bool對象,而是對位進行打包,並通過掩碼和移位1進行訪問。 這使得數據結構非常易於緩存,但是操作更加復雜。 這對性能的好壞取決於您對它的處理方式以及CPU體系結構。

比性能考慮更重要的是,這意味着您可以依賴於其他數組的某些保證不適用於std::vector<bool> 例如,您不能獲取元素的地址,也不能在不同步的情況下修改不同線程中的不同元素。 對於您的特殊情況,由於不能保證布爾對象,因此肯定不能保證向量中存在連續的布爾對象。

因此,如果需要規則的bool數組,則在使用向量時需要解決專業化問題。 例如:

enum boolean : bool {no, yes};
std::vector<boolean> matrix;

1從技術上講,不能保證任何特定的表示。 它是實現定義的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM