[问题] 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