[問題] std::array class 跟普通的array哪個好?

看板C_and_CPP作者 (沒有存在感的人)時間9年前 (2015/03/01 19:27), 編輯推噓9(9055)
留言64則, 12人參與, 最新討論串1/2 (看更多)
問題(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

03/01 19:37, , 1F
當參數傳遞時不會退化成pointer
03/01 19:37, 1F

03/01 19:38, , 2F
跟其他stl container有共同介面互換性比較好
03/01 19:38, 2F

03/01 19:40, , 3F
可轉tuple TMP下的操作比較簡單
03/01 19:40, 3F

03/01 23:11, , 4F
我都用vector 不知道有甚麼差別
03/01 23:11, 4F

03/01 23:30, , 5F
請問"當參數傳遞時不會退化成pointer"是啥意思?
03/01 23:30, 5F

03/01 23:54, , 6F
看起來std::array是fix-length的
03/01 23:54, 6F

03/02 00:00, , 7F
std::vector跟std::array有什麼差別, 可以想看看std::vector
03/02 00:00, 7F

03/02 00:00, , 8F
跟一般的array有什麼差別
03/02 00:00, 8F

03/02 00:28, , 9F
我不是要問vector跟array的差別,我是要問
03/02 00:28, 9F

03/02 00:29, , 10F
用std::array宣告的array跟普通的array的差別
03/02 00:29, 10F

03/02 00:36, , 11F
void func(int ary[5]) ; void func(array<int,5> ary);
03/02 00:36, 11F

03/02 03:26, , 12F
並沒有明顯好處,甚至有點難用。不會退化表示一定要寫te
03/02 03:26, 12F

03/02 03:26, , 13F
mplate來處理不同長度的array
03/02 03:26, 13F

03/02 03:29, , 14F
還有,處理二維以上時角括號層層疊疊更難閱讀…
03/02 03:29, 14F

03/02 12:42, , 15F
回wtchen: 我是回fireslayer的問題
03/02 12:42, 15F

03/02 13:21, , 16F
要明確指定陣列長度,或是想pass by value的時候
03/02 13:21, 16F

03/02 13:21, , 17F
個人幾乎沒有碰過這種狀況就是了
03/02 13:21, 17F

03/02 13:22, , 18F
簡單講當你不知道差在哪的時候std::array沒任何好處
03/02 13:22, 18F

03/02 13:24, , 19F
當你知道差在哪,那在某些很侷限的狀況下可能有好處
03/02 13:24, 19F

03/02 13:27, , 20F
std::array我比較常用的情況就是指名特定長度
03/02 13:27, 20F

03/02 13:27, , 21F
來當作參數,這個特點在[][]尤其有用
03/02 13:27, 21F

03/02 13:28, , 22F
比方說foo(std::array<FooClass,3> a)
03/02 13:28, 22F

03/02 13:30, , 23F
或者void foo(array<array<int, 3>, 3> a)
03/02 13:30, 23F

03/02 13:31, , 24F
不過這大概也是唯一我會用它的用途了...(抓毛)
03/02 13:31, 24F

03/02 13:31, , 25F
[][]的場合,退化是個大問題
03/02 13:31, 25F

03/02 13:32, , 26F
更何況老實講,退化並不是一個很好閱讀的東西就是...
03/02 13:32, 26F

03/02 21:34, , 27F
請問殺手貓哥,如果是指定長度的array,不是可以用
03/02 21:34, 27F

03/02 21:35, , 28F
void foo(int &arr[10]) ←這樣??我記得這樣編譯器就會
03/02 21:35, 28F

03/02 21:35, , 29F
檢查你傳進去的長度??
03/02 21:35, 29F

03/02 21:37, , 30F
還是說這樣傳雖然會檢查長度,但是函式內的行為還是退化
03/02 21:37, 30F

03/02 21:38, , 31F
為指標,結果還是無法確定長度??
03/02 21:38, 31F

03/02 22:22, , 32F
要寫成(&arr)[10]
03/02 22:22, 32F

03/02 22:36, , 33F
對對對,謝謝樓上,少了括號了 QQ
03/02 22:36, 33F

03/02 22:50, , 34F
二維沒辦法用退化,另外其實按照這種寫法也只是編譯
03/02 22:50, 34F

03/02 22:50, , 35F
時期會檢查而已,執行期的時候還是當做退化來看(不過
03/02 22:50, 35F

03/02 22:51, , 36F
這實在無關緊要就是)
03/02 22:51, 36F

03/02 22:52, , 37F
嗯嗯,我就是想知道這個,謝啦!!
03/02 22:52, 37F

03/03 00:58, , 38F
想問很久了,請問你們說的「退化」是啥意思?
03/03 00:58, 38F

03/03 01:16, , 39F
array 的第一維會自動 "decay" 成 pointer
03/03 01:16, 39F

03/03 08:32, , 40F
這真的有人在用嗎?我覺得挺難用的
03/03 08:32, 40F

03/03 08:56, , 41F
能用的地方太少,不過有些地方是非她不可
03/03 08:56, 41F

03/03 08:57, , 42F
多半都只會用在參數傳遞跟回傳值而已 尤其是包tuple
03/03 08:57, 42F

03/03 09:00, , 43F
說到decay 可以看看置底13戒的第12項 這也是為什麼某些
03/03 09:00, 43F

03/03 09:00, , 44F
參數傳入傳出用std::array比較好的理由 尤其是多維
03/03 09:00, 44F

03/04 22:54, , 45F
可以用 using 來簡化,話說編譯時期檢查執行期退化我有
03/04 22:54, 45F

03/04 22:55, , 46F
點不太懂意思?
03/04 22:55, 46F

03/05 15:20, , 47F
編譯期雖然會檢查你傳入的陣列大小和不合法
03/05 15:20, 47F

03/05 15:20, , 48F
但是它實際上執行其並沒有把這資訊放進來 所以你可以
03/05 15:20, 48F

03/05 15:20, , 49F
用一個pointer合法的接起來 合法的out of range
03/05 15:20, 49F

03/05 15:21, , 50F
而且二維會死。但std::array會明確的把array size
03/05 15:21, 50F

03/05 15:21, , 51F
帶進來,而且不管幾維都可以,主要差異在這裡
03/05 15:21, 51F

03/05 21:09, , 52F
STL容器的好處就是填了一些坑,然後提供了一些成員方法
03/05 21:09, 52F

03/05 21:20, , 54F
退化的意思是假如原PO今天要把一條array傳進一個函數處理
03/05 21:20, 54F

03/05 21:21, , 55F
那其實你傳進去的不是Array 而是Array的指標 這時如果你
03/05 21:21, 55F

03/05 21:22, , 56F
在函數內對Array用sizeof 那大小永遠只會有4(指標大小)
03/05 21:22, 56F

03/05 21:24, , 57F
補充:傳進去的Array指標還只是第0個原素的指標 C/C++無法
03/05 21:24, 57F

03/05 21:25, , 58F
在函數內還原得知Ararry的大小 所以C語言才要另外傳size
03/05 21:25, 58F

03/07 21:26, , 59F
其實我個人在管理專案的時候是把arraay decay當作是一
03/07 21:26, 59F

03/07 21:26, , 60F
個很嚴重的設計失誤,不過需要用的C lib太多,所以也沒
03/07 21:26, 60F

03/07 21:27, , 61F
辦法很強制執行,只能盡可能避免在自家寫的code出現
03/07 21:27, 61F

03/07 21:28, , 62F
不過除非函數應該要傳固定size的array 不然與其用
03/07 21:28, 62F

03/07 21:29, , 63F
std::array, 用tuple應該是更簡單的方法
03/07 21:29, 63F

03/07 21:29, , 64F
除非array size真的太大了...
03/07 21:29, 64F
文章代碼(AID): #1KylULtB (C_and_CPP)
文章代碼(AID): #1KylULtB (C_and_CPP)