C 如何實現乙個給定維度的多維變長陣列型別

時間 2021-06-30 14:03:47

1樓:

Github上有類似的專案(head-only庫)給 dynarray 做了些修補和擴充套件,現在還能用,或許可以滿足題主的要求。

首先是這個,出現得比較早,就叫做 dynarray:

Robbepop/dynarray

基本能滿足需求,只要不使用自定義分配器(allocator)的話。如果要用自定義分配器,那可能會導致程式崩掉(取決於自定義分配器怎麼實現)。因為它的內部實現是個unique_ptr,沒有考慮分配器的場景。

接著是這個,名字叫做 VLA for C++: dynarray:

cnbatch/dynarray

從描述來看,其實是做成達到 C99 VLA 那樣的效果,只不過是 C++ 容器版本的。

這個庫自帶的各種函式更加接近現有的各種標準庫容器,也可以用自定義分配器,但分配器使用方式不同於其它的標準庫容器。對於標準庫容器,一般都是要求使用者提供 allocator。而這個庫要求提供 allocator 的模板名。

比較特別的是,這個庫分別用不同的標頭檔案提供了兩種寫法:

寫法1:

vla::dynarray> vla_array_a(100, 300);

寫法2:

vla::

dynarray

2>vla_array_a

(100

,300

);以上均摘抄自專案說明。

對於多維陣列,那應該就是:

寫法1:

vla::dynarray>>> vla_array_a(100, 200, 300, 400);

寫法2:

vla::dynarray vla_array_a(100, 200, 300, 400);

其中,寫法2很接近於題主的要求。

當然了,如果題主需要在使用過程中動態改變每維陣列的長度(就像 vector 那樣 push 或 pop),那麼這兩個庫都做不到。

2樓:netcan

這屬於C++型別計算範疇問題,除了 @arrayJY提到的傳統模板方式,補充一點,可以使用變數模板來做。

變數模板的好處在於可以構造乙個物件(建構函式)而不僅僅是型別。

template

size_t

...Ns

>auto

vector_n=T

{};template

size_t

N>auto

vector_n

=vector

(N

);template

size_tN,

size_t

...Ns

>auto

vector_n

>=vector

(vector_n

>)>(N

,vector_n

>);測試用例。

3樓:arrayJY

template

std::

size_t

N>struct

vector_n

;template

T>struct

vector_n

;autox=

vector_n

3>::

type

{}// std::vector>>

如何自己用c 實現乙個類似於windows中的cmd的程式?

風中勁草 題主意思可能是兩方面,一是實現shell,就是windows下的批處理指令碼直譯器cmd.exe,這個是不難實現的,可以通過yacc和lex來編寫乙個語法解析器,來實現shell指令碼解釋的功能。另乙個是終端模擬器,實現乙個支援標準輸入輸出以及能夠相容win32下終端處理函式的使用者互動介...

C語言編譯器是如何實現指標 1這樣的乙個機制?

p的值被load到某個暫存器r,然後add r,4 就可以了。這裡4已經被編譯器用sizeof array item type 給換成立即數了。所以你說的什麼p 和 1,實際上沒什麼區別。如果有人要拿這個來說快慢,恕我直言,也許是因為他還不夠了解底層的cpu是如何執行指令的這乙個層面。 這個很簡單,...

C 裡如何實現乙個字典,取值時如果key不存在就返回null?

糖胖胖OVO 乙個很簡單的方式就可以解決了只需將Dictionary dict new Dictionary 改為Dictionary dict new Dictionary 準確的來說就是將TValue變為Nullable型別,這時的default TValue 就是null了。結果為True. ...