[問題] 請教for_each和accumulate有何好處?

看板C_and_CPP作者 (呆伯特)時間13年前 (2011/01/10 18:43), 編輯推噓6(8230)
留言40則, 7人參與, 最新討論串1/1
在許多網站和書籍中都提到 如果我們要對一個容器裡的所有資料作某些操作 應該使用for_each 而不是用最基本的for(int n = 0; n < nSize; ++n) {...} 更進一步地,如果是數值方面的操作,可以考慮使用accumulation 不過所有這些書籍都只提到"應該這樣做",但沒有說明"為什麼應該" for_each比起for並沒有比較靈活,可讀性亦不佳(funtor不是人人都懂的) 至於效率,我在STL源碼剖析裡看到的for_each也沒用到甚麼特別高效率的手法 實際上寫程式來測時間,也沒有比較快,很多時候for還比較快 accumulate與for的比較亦然 請問for_each和accumulate到底有甚麼好處?為什麼大家都推薦要用? 謝謝 -- 「你要不要加入我們的TTP計畫?」 「什麼是TTP計畫?」 「喔,就是The TTP Project的縮寫」 <<呆伯特法則>> -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 220.228.146.2

01/10 18:47, , 1F
我不覺得for_each可讀性有差到哪耶= =a
01/10 18:47, 1F

01/10 18:50, , 2F
樓上應該很熟悉funtor了,對初學者而言for終究比較親切囉
01/10 18:50, 2F

01/10 19:21, , 3F
利用interface去隔離 algorithm 和container
01/10 19:21, 3F

01/10 19:23, , 4F
也可藉此達到隱藏資訊,建議你看一下 iterator pattern
01/10 19:23, 4F

01/10 20:30, , 5F
感覺for_each好讀很多....
01/10 20:30, 5F

01/10 20:33, , 6F
for_each好讀很多?說笑吧,如果只是說for_each僅需一行的話
01/10 20:33, 6F

01/10 20:35, , 7F
把for裡面的行為拆出去成一個inline function也一樣簡潔
01/10 20:35, 7F

01/10 20:42, , 8F
不是討論for跟for_each嗎 自己再寫func不就本末倒置
01/10 20:42, 8F

01/10 20:48, , 9F
我說的是在for裡面呼叫一個inline function,沒有本末倒置
01/10 20:48, 9F

01/10 20:48, , 10F
光是看到for還要去思考它的range就沒有for_each好懂了..
01/10 20:48, 10F

01/10 20:49, , 11F
for_each也是把迴圈內行為拆出去,只不過不是函式而是仿函式
01/10 20:49, 11F

01/10 20:50, , 12F
"對某個容器裡所有元素做以下操作"for_each不是很合意嗎
01/10 20:50, 12F

01/10 20:50, , 13F
不想用functor寫在別的地方你可以用lamda啊XD
01/10 20:50, 13F

01/10 20:52, , 14F
這個就見仁見智了,我是覺得range對可讀性沒有多少影響
01/10 20:52, 14F

01/10 21:39, , 15F
因為我很懶,所以我喜歡for_each這一類的東西~~
01/10 21:39, 15F

01/10 21:40, , 16F
這樣我就不用記怎麼存取container的方法
01/10 21:40, 16F

01/10 21:42, , 17F
介面越是一致,需要記的東西就可以越少~
01/10 21:42, 17F

01/10 21:47, , 18F
而且介面越是一致,也代表哪天換了別的container
01/10 21:47, 18F

01/10 21:48, , 19F
相關的實作還是可以跑,不會因此連動的要改一大堆地方。
01/10 21:48, 19F

01/11 00:50, , 20F
好讀怎麼可能是說笑? 原始的 for 可以寫出同時對多個
01/11 00:50, 20F

01/11 00:51, , 21F
容器操作的東西, 甚至也可以寫出跟步進不相關的內容,
01/11 00:51, 21F

01/11 00:54, , 22F
從他限制了只能對迭代器做操作, 以及強制代入functor
01/11 00:54, 22F

01/11 00:55, , 23F
可寫性降低換來的是比較可以想像的行為, 不是你寫 for
01/11 00:55, 23F

01/11 00:56, , 24F
就能告訴讀者的
01/11 00:56, 24F

01/11 01:11, , 25F
另外像連續賦值用 fill, 複製用 copy, functor 我覺得
01/11 01:11, 25F

01/11 01:12, , 26F
以算是基本知識了, 連 STL 都看不懂只能說程度太差,
01/11 01:12, 26F

01/11 01:12, , 27F
怨不了別人
01/11 01:12, 27F

01/11 12:49, , 28F
受教了,不過小小發個牢騷,所謂程度太差怨不得別人云云
01/11 12:49, 28F

01/11 12:50, , 29F
其實程度差是不會怨的,程度好的人才會怨,因為你寫的code
01/11 12:50, 29F

01/11 12:52, , 30F
別人看不懂,那往後的修改都只能由你維護,永遠沒有轉移的一
01/11 12:52, 30F

01/11 12:53, , 31F
天,這是台灣軟體業注重速成的悲哀
01/11 12:53, 31F

01/11 21:52, , 32F
寫C++還要怕別人不懂for_each, 那 printf 我也好怕別
01/11 21:52, 32F

01/11 21:53, , 33F
人維護不了喔...
01/11 21:53, 33F

01/11 21:59, , 34F
接下來是主觀意見: for表達的語意是「重覆執行某些指
01/11 21:59, 34F

01/11 22:00, , 35F
令」for_each是「對集合每個元素都做某些事」, 從這幾
01/11 22:00, 35F

01/11 22:02, , 36F
個字就可以猜後面在做什麼, 根本不用看到本體, 還卑不
01/11 22:02, 36F

01/11 22:02, , 37F
悲哀, 只停留在功能面還有資格說這種話?
01/11 22:02, 37F

01/12 01:34, , 38F
在 C++0x lambda expression 出來之後才真正變方便一點
01/12 01:34, 38F

01/12 21:15, , 39F
for_each有其適用範圍, 硬要把它用在不合適的地方然後
01/12 21:15, 39F

01/12 21:17, , 40F
說 functor 不方便可讀性差等理由, 已經不算是比較了
01/12 21:17, 40F
文章代碼(AID): #1DAkAxi3 (C_and_CPP)