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

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

Links booklink

Contact Us: admin [ a t ] ucptt.com