7.6 常用內建函式

C++ 標準函式庫已經為我們實現了很多常用的功能,不用重複造輪子。認識這些內建函式能大幅加快寫程式的速度。

內建函式住在各種不同的「函式庫」(library)裡。使用前必須用 #include<...> 把對應的函式庫引入。

常用內建函式清單

1. swap(a, b) —— 交換兩個值

  • 位置#include<algorithm>(跟下面的 maxmin 記同一個標頭檔就好。嚴格說它的正式住址是 <utility>,不過 g++ 的 <algorithm> 一直都拿得到,不必多背一個名字)
  • 用途:交換兩個變數的值
  • 限制:a 和 b 的型態必須一樣,不能傳數字字面常數

單元開頭我們自己寫了 mySwap——其實標準函式庫早就提供了一模一樣的功能,直接用就行:

#include<iostream>
#include<algorithm>
using namespace std;

int main() {
    int a = 5, b = 3;
    cout << "Before swap: " << a << " " << b << "\n";

    swap(a, b);  // 直接交換,比自己用暫存變數寫三行方便多了

    cout << "After swap: " << a << " " << b << "\n";

    return 0;
}

執行結果:

Before swap: 5 3
After swap: 3 5

2. max(a, b)min(a, b) —— 找最大/最小值

  • 位置#include<algorithm>
  • 用途:找兩個數中的最大/最小值,或用大括號列出多個數
  • 限制:所有參數型態必須一致
#include<iostream>
#include<algorithm>
using namespace std;

int main() {
    int a = 5, b = 3;
    cout << max(a, b) << "\n";      // 輸出 5
    cout << min(a, b) << "\n";      // 輸出 3

    // 找多個數的最大值:用大括號
    cout << max({1, 5, 3, 9, 2}) << "\n";  // 輸出 9
    cout << min({1, 5, 3, 9, 2}) << "\n";  // 輸出 1

    return 0;
}

執行結果:

5
3
9
1

3. abs(x) —— 絕對值

  • 位置#include<cstdlib>(整數絕對值)
  • 用途:計算一個數的絕對值
#include<iostream>
#include<cstdlib>
using namespace std;

int main() {
    int a = -5;
    cout << abs(a) << "\n";      // 輸出 5
    cout << abs(-3 - 7) << "\n"; // 輸出 10

    return 0;
}

執行結果:

5
10

4. gcd(x, y)lcm(x, y) —— 最大公因數與最小公倍數

  • 位置#include<numeric>(C++17 及以後)
  • 用途:計算最大公因數(greatest common divisor)和最小公倍數(least common multiple)
#include<iostream>
#include<numeric>
using namespace std;

int main() {
    int a = 12, b = 8;
    cout << "gcd(12, 8) = " << gcd(a, b) << "\n";  // 輸出 4
    cout << "lcm(12, 8) = " << lcm(a, b) << "\n";  // 輸出 24

    return 0;
}

執行結果:

gcd(12, 8) = 4
lcm(12, 8) = 24

三個以上的數怎麼算?疊著呼叫就行

gcdlcm 一次只吃兩個參數,但「三個數的最大公因數」等於「前兩個數的最大公因數,再和第三個數取最大公因數」——正好用上 7.1 學過的巢狀呼叫:

#include<iostream>
#include<numeric>
using namespace std;

int main() {
    long long x = 12, y = 30, z = 20;
    cout << gcd(gcd(x, y), z) << "\n";  // 三個數的最大公因數:2
    cout << lcm(lcm(x, y), z) << "\n";  // 三個數的最小公倍數:60

    return 0;
}

執行結果:

2
60

swapmaxmin 是 C++ 解題時很常用的小工具。它們在排序、比較、維護最大最小值等問題中經常出現,熟練使用能減少重複程式碼。

動手試試看:寫一個程式,讀入三個整數,用 max 找出最大的,用 min 找出最小的,用 abs 計算最大值和最小值的差。