簡體   English   中英

std::transform 可以替換為 std::accumulate 嗎?

[英]Can std::transform be replaced by std::accumulate?

我有一個普遍的問題。 我們可以總是用std::accumulate替換std::transform嗎? 我在許多情況/示例中都看到了這種替換。 那么這在理論上是否可行,如果是這樣,那么為什么要引入std::transform呢?

這兩種算法的目的完全不同。

std::accumulate在函數式編程世界中被稱為折疊,它的目的是迭代序列的元素並對這些元素應用兩個參數的折疊操作,一個參數是先前折疊的結果,另一個是序列的元素。 它自然地返回單個結果 - 將序列的所有元素折疊成一個值。

另一方面, std::transform值從一個序列復制到另一個序列,對每個元素應用一元運算。 它返回一個迭代器到序列的末尾。

您可以提供任何代碼作為折疊操作的事實允許我們使用std::accumulate作為通用循環替換,包括將值復制到其他容器中的選項,但這是不明智的,因為它的全部原因引入這些(相當簡單的)算法是為了使程序更加明確。 讓一個算法執行通常與另一個算法相關聯的任務是不那么明確和違反直覺的。

一個通用的循環替換算法是std::for_each ,但是對於循環的范圍,它在很大程度上已經過時了,我已經很長時間沒有看到它在使用了。

我們可以總是用std::accumulate替換std::transform嗎?

沒有。每個cppreference std::accumulate的二進制謂詞op

op不得使任何迭代器無效,包括結束迭代器,也不得修改所涉及范圍的任何元素,以及*last

所以它實際上不能轉換你給它的范圍,這是std::transform的主要用例。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM