看板 C_and_CPP 關於我們 聯絡資訊
問題(Question): 在coursera看到有人用std::array去宣告array http://www.cplusplus.com/reference/array/array/ 可是array不是用一般方式宣告就好了嗎? 例如說 int foo [5] = { 16, 2, 77, 40, 12071 }; 多include 一個array標頭再宣告成 std::array<int,5> foo = { 16, 2, 77, 40, 12071 }; 不是比較麻煩嗎? 我想問的是用std:array宣告array有啥特別的優點呢? 謝謝。 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 90.41.186.119 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1425209237.A.DCB.html
azureblaze: 當參數傳遞時不會退化成pointer 03/01 19:37
azureblaze: 跟其他stl container有共同介面互換性比較好 03/01 19:38
azureblaze: 可轉tuple TMP下的操作比較簡單 03/01 19:40
fireslayer: 我都用vector 不知道有甚麼差別 03/01 23:11
wtchen: 請問"當參數傳遞時不會退化成pointer"是啥意思? 03/01 23:30
fireslayer: 看起來std::array是fix-length的 03/01 23:54
kwpn: std::vector跟std::array有什麼差別, 可以想看看std::vector 03/02 00:00
kwpn: 跟一般的array有什麼差別 03/02 00:00
wtchen: 我不是要問vector跟array的差別,我是要問 03/02 00:28
wtchen: 用std::array宣告的array跟普通的array的差別 03/02 00:29
EdisonX: void func(int ary[5]) ; void func(array<int,5> ary); 03/02 00:36
CaptainH: 並沒有明顯好處,甚至有點難用。不會退化表示一定要寫te 03/02 03:26
CaptainH: mplate來處理不同長度的array 03/02 03:26
CaptainH: 還有,處理二維以上時角括號層層疊疊更難閱讀… 03/02 03:29
kwpn: 回wtchen: 我是回fireslayer的問題 03/02 12:42
azureblaze: 要明確指定陣列長度,或是想pass by value的時候 03/02 13:21
azureblaze: 個人幾乎沒有碰過這種狀況就是了 03/02 13:21
azureblaze: 簡單講當你不知道差在哪的時候std::array沒任何好處 03/02 13:22
azureblaze: 當你知道差在哪,那在某些很侷限的狀況下可能有好處 03/02 13:24
Killercat: std::array我比較常用的情況就是指名特定長度 03/02 13:27
Killercat: 來當作參數,這個特點在[][]尤其有用 03/02 13:27
Killercat: 比方說foo(std::array<FooClass,3> a) 03/02 13:28
Killercat: 或者void foo(array<array<int, 3>, 3> a) 03/02 13:30
Killercat: 不過這大概也是唯一我會用它的用途了...(抓毛) 03/02 13:31
Killercat: [][]的場合,退化是個大問題 03/02 13:31
Killercat: 更何況老實講,退化並不是一個很好閱讀的東西就是... 03/02 13:32
wenyonba: 請問殺手貓哥,如果是指定長度的array,不是可以用 03/02 21:34
wenyonba: void foo(int &arr[10]) ←這樣??我記得這樣編譯器就會 03/02 21:35
wenyonba: 檢查你傳進去的長度?? 03/02 21:35
wenyonba: 還是說這樣傳雖然會檢查長度,但是函式內的行為還是退化 03/02 21:37
wenyonba: 為指標,結果還是無法確定長度?? 03/02 21:38
CaptainH: 要寫成(&arr)[10] 03/02 22:22
wenyonba: 對對對,謝謝樓上,少了括號了 QQ 03/02 22:36
Killercat: 二維沒辦法用退化,另外其實按照這種寫法也只是編譯 03/02 22:50
Killercat: 時期會檢查而已,執行期的時候還是當做退化來看(不過 03/02 22:50
Killercat: 這實在無關緊要就是) 03/02 22:51
wenyonba: 嗯嗯,我就是想知道這個,謝啦!! 03/02 22:52
wtchen: 想問很久了,請問你們說的「退化」是啥意思? 03/03 00:58
bibo9901: array 的第一維會自動 "decay" 成 pointer 03/03 01:16
ACMANIAC: 這真的有人在用嗎?我覺得挺難用的 03/03 08:32
Killercat: 能用的地方太少,不過有些地方是非她不可 03/03 08:56
Killercat: 多半都只會用在參數傳遞跟回傳值而已 尤其是包tuple 03/03 08:57
Killercat: 說到decay 可以看看置底13戒的第12項 這也是為什麼某些 03/03 09:00
Killercat: 參數傳入傳出用std::array比較好的理由 尤其是多維 03/03 09:00
carylorrk: 可以用 using 來簡化,話說編譯時期檢查執行期退化我有 03/04 22:54
carylorrk: 點不太懂意思? 03/04 22:55
Killercat: 編譯期雖然會檢查你傳入的陣列大小和不合法 03/05 15:20
Killercat: 但是它實際上執行其並沒有把這資訊放進來 所以你可以 03/05 15:20
Killercat: 用一個pointer合法的接起來 合法的out of range 03/05 15:20
Killercat: 而且二維會死。但std::array會明確的把array size 03/05 15:21
Killercat: 帶進來,而且不管幾維都可以,主要差異在這裡 03/05 15:21
NilPtr: STL容器的好處就是填了一些坑,然後提供了一些成員方法 03/05 21:09
NilPtr: 退化的意思是假如原PO今天要把一條array傳進一個函數處理 03/05 21:20
NilPtr: 那其實你傳進去的不是Array 而是Array的指標 這時如果你 03/05 21:21
NilPtr: 在函數內對Array用sizeof 那大小永遠只會有4(指標大小) 03/05 21:22
NilPtr: 補充:傳進去的Array指標還只是第0個原素的指標 C/C++無法 03/05 21:24
NilPtr: 在函數內還原得知Ararry的大小 所以C語言才要另外傳size 03/05 21:25
Killercat: 其實我個人在管理專案的時候是把arraay decay當作是一 03/07 21:26
Killercat: 個很嚴重的設計失誤,不過需要用的C lib太多,所以也沒 03/07 21:26
Killercat: 辦法很強制執行,只能盡可能避免在自家寫的code出現 03/07 21:27
Killercat: 不過除非函數應該要傳固定size的array 不然與其用 03/07 21:28
Killercat: std::array, 用tuple應該是更簡單的方法 03/07 21:29
Killercat: 除非array size真的太大了... 03/07 21:29