C 中accumulate的用法

2021-10-03 08:44:19 字數 3454 閱讀 3156

定義於標頭檔案< numeric>

template

<

class

inputit

,class

t>

constexpr t accumulate

( inputit first, inputit last, t init )

;

template

<

class

inputit

,classt,

class

binaryoperation

>

constexpr t accumulate

( inputit first, inputit last, t init, binaryoperation op )

;

計算給定值 init 與給定範圍 [first, last) 中元素的和。第一版本用 operator+ ,第二版本用二元函式 op 求和元素,均將 std::move 應用到其左側運算數 (c++20 起)。

op 必須不非法化涉及範圍的任何迭代器,含尾迭代器,且不修改其所涉及範圍的任何元素及 *last 。(c++11 起)

引數first, last -要求和的元素範圍

init -和的初值

op -被使用的二元函式物件。接收當前積累值 a (初始化為 init )和當前元素 b 的二元運算子。

該函式的簽名應當等價於:

ret fun

(const type1 &a,

const type2 &b)

;

被使用的二元函式物件。接收當前積累值 a (初始化為 init )和當前元素 b 的二元運算子。
該函式的簽名應當等價於:

ret fun(const type1 &a, const type2 &b);

簽名中並不需要有 const &。

型別 type1 必須使得 t 型別的物件能隱式轉換到 type1 。型別 type2 必須使得 inputit 型別的物件能在解引用後隱式轉換到 type2 。 型別 ret 必須使得 t 型別物件能被賦 ret 型別值。 ​

型別要求

inputit 必須滿足遺留輸入迭代器 (legacyinputiterator) 的要求。

t 必須滿足可複製賦值 (copyassignable) 和 可複製構造 (copyconstructible) 的要求。

返回值給定值與給定範圍中的元素的和。

給定範圍在 op 上左摺疊的結果 註解

std::accumulate 進行左摺疊。為進行右摺疊,必須逆轉二元運算子的引數順序,並使用逆序迭代器。

可能的實現

版本一

template

<

class

inputit

,class

t>

constexpr

// c++20 起

t accumulate

(inputit first, inputit last, t init)

return init;

}

版本二

template

<

class

inputit

,classt,

class

binaryoperation

>

constexpr

// c++20 起

t accumulate

(inputit first, inputit last, t init,

binaryoperation op)

return init;

}

示例
#include

#include

#include

#include

#include

intmain()

;int sum = std::

accumulate

(v.begin()

, v.

end(),

0);int product = std::

accumulate

(v.begin()

, v.

end(),

1, std::multiplies<

int>()

);auto dash_fold =

(std::string a,

int b);

std::string s = std::

accumulate

(std::

next

(v.begin()

), v.

end(),

std::

to_string

(v[0])

,// 用首元素開始

dash_fold)

;// 使用逆向迭代器右摺疊

std::string rs = std::

accumulate

(std::

next

(v.rbegin()

), v.

rend()

, std::

to_string

(v.back()

),// 用首元素開始

dash_fold);

std::cout <<

"sum: "

<< sum <<

'\n'

<<

"product: "

<< product <<

'\n'

<<

"dash-separated string: "

<< s <<

'\n'

<<

"dash-separated string (right-folded): "

<< rs <<

'\n'

;}

輸出

sum:

55product:

3628800

dash-separated string:1-

2-3-

4-5-

6-7-

8-9-

10dash-separated string (right-folded):10

-9-8

-7-6

-5-4

-3-2

-1

C 的STL中accumulate的用法

所需的標頭檔案 include 可以用來計算特定範圍內所有元素的和 或者平均值。std vector vec points src 向量 size t num pts vec points src.size tmp 是向量vec points src內每一維的和 eigen vector3d tmp...

STL中accumulate的用法

accumulate定義在 include中,作用有兩個,乙個是累加求和,另乙個是自定義型別資料的處理 int sum accumulate vec.begin vec.end 累加的初始值 例 數值相加 int sum accumulate vec.begin vec.end 42 字串拼接 st...

c 中 的用法

c 中的 至少有以下幾種作用 1.忽略轉義字元 例如 string filename d 文字檔案 text.txt 使用 後 string filename d 文字檔案 text.txt 2.讓字串跨行 例如 string strsql select from humanresources.em...