日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學(xué)無(wú)先后,達(dá)者為師

網(wǎng)站首頁(yè) 編程語(yǔ)言 正文

C++?STL?中的數(shù)值算法示例講解_C 語(yǔ)言

作者:Aatrowen ? 更新時(shí)間: 2022-06-10 編程語(yǔ)言

以下算法均包含在頭文件 numeric 中

1.iota

該函數(shù)可以把一個(gè)范圍內(nèi)的序列從給定的初始值開(kāi)始累加
先看用法。
例:
假設(shè)我需要一個(gè)長(zhǎng)度為10,從5開(kāi)始遞增的序列

    vector a(10);
    iota(begin(a), end(a), 5);

    for (auto x : a) {
        cout << x << " ";
    }

輸出:

5 6 7 8 9 10 11 12 13 14

這樣就可以很方便的創(chuàng)建一個(gè)遞增的序列,而不用使用for循環(huán)
此外,該函數(shù)是使用連續(xù)的支持 operator++()的 T 類(lèi)型值填充序列
也就是說(shuō)double類(lèi)型也可以使用,string類(lèi)型也可以使用。
只要是重載了++運(yùn)算符的類(lèi)型都可以使用。

2.accumulate

曾經(jīng)在算法比賽中看見(jiàn)別人使用accumulate函數(shù)計(jì)算出了一個(gè)數(shù)組的和。
覺(jué)得特別的優(yōu)雅,像這樣:

    vector a(10);
    iota(begin(a), end(a), 1);

    cout << accumulate(begin(a), end(a), 0) << "\n";  // 計(jì)算從1加到10的和,從0開(kāi)始加

輸出:

55

從那天起,每當(dāng)我要求一個(gè)序列的和的時(shí)候,我都會(huì)使用這個(gè)方法...
但是今天,當(dāng)我看到accumulate的源碼之后:

template 
   T accumulate (InputIterator first, InputIterator last, T init)
{
  while (first!=last) {
    init = init + *first;  // or: init=binary_op(init,*first) for the binary_op version
    ++first;
  }
  return init;
}

注意看這里:

哇哦,它竟然還支持二元仿函數(shù),詳解C++ functional庫(kù)中的仿函數(shù)使用方法
于是,我有了一個(gè)大膽的想法。
求一個(gè)數(shù)組的乘積

    vector a(10);
    iota(begin(a), end(a), 1);

    cout << accumulate(begin(a), end(a), 1, multiplies()) << "\n";  // 計(jì)算從1加到10的乘積,從1開(kāi)始乘

輸出:

3628800

同理,還可以求數(shù)組的減,數(shù)組的除,數(shù)組的模?

3.partial_sum

這個(gè)函數(shù)可以用來(lái)求前綴和,前綴和指一個(gè)數(shù)組的某下標(biāo)之前的所有數(shù)組元素的和(包含其自身)。

例如,1、2、3、4、5的前綴和數(shù)組為 1 3 6 10 15

    vector a(5);
    iota(begin(a), end(a), 1);

    partial_sum(begin(a), end(a), begin(a)); // 求a的前綴和,賦值給a數(shù)組(第三個(gè)參數(shù))

    for (auto x : a) {
        cout << x << " ";
    }

輸出:

1 3 6 10 15

有了上一個(gè)函數(shù)的經(jīng)驗(yàn),我們還可以求一個(gè)數(shù)組的前綴乘、除等

例:

    partial_sum(begin(a), end(a), begin(a), multiplies());

輸出:

1 2 6 24 120

4.adjacent_difference

這個(gè)函數(shù)可以對(duì)一個(gè)序列里相鄰兩個(gè)元素進(jìn)行運(yùn)算,通過(guò)differerce這個(gè)詞可以看出來(lái),默認(rèn)是計(jì)算相鄰兩元素的差

vector a{1, 4, 5, 100, 40};

adjacent_difference(begin(a), end(a), begin(a)); // 求a數(shù)組相鄰元素的差,賦值給a數(shù)組(第三個(gè)參數(shù))

for (auto x : a) {
    cout << x << " ";
}

輸出:

1 3 1 95 -60

今天我想計(jì)算相鄰兩元素的乘積

adjacent_difference(begin(a), end(a), begin(a), multiplies());

輸出:

1 4 20 500 4000

5.inner_product

這個(gè)函數(shù)默認(rèn)情況下可以求序列中每個(gè)元素的內(nèi)積之和:

    vector a(3);
    iota(begin(a), end(a), 1);

    cout << inner_product(begin(a), end(a), begin(a), 10) << "\n"; // 從初值10開(kāi)始加上序列各元素的內(nèi)積

輸出:

24

還可以用來(lái)求兩個(gè)序列元素兩兩相乘再相加的結(jié)果

    vector a{1, 2, 3};
    vector b{2, 3, 4};

    // 1 * 2 + 2 * 3 + 3 * 4
    cout << inner_product(begin(a), end(a), begin(b), 0) << "\n";

輸出:

20

此外,還可以通過(guò)仿函數(shù)來(lái)替代上述的兩個(gè)操作符 + 和 *

    vector a{1, 2, 3};
    vector b{2, 3, 4};

    cout << inner_product(begin(a), end(a), begin(b), 1
                        , multiplies(), minus()) << "\n";
                            // 原來(lái)的加法 +  // 原來(lái)的乘法 *
                            // 計(jì)算 (1 - 2) * (2 - 3) * (3 - 4) = -1

輸出:

-1

原文鏈接:https://www.cnblogs.com/Aatrowen-Blog/p/16114383.html

欄目分類(lèi)
最近更新