C++高階功能

Lgx_Q發表於2024-08-02

Lambda 匿名函式

[只讀列表](引數列表) {函式體}

  • 例如:
sort(a + 1, a + n, [](const Data &x, const Data &y) {
    return x.val < y.val;
}
const int k = 5;
auto calc = [k](const int &x) {return x * k;}

template 模板

在 struct/namespace/函式 前加入 template <typename T, ...> 可用型別 T 表示“任意一種型別”。

  • 例如:
template<typename T>
void abs(T x) {
return (x<0) ? -x : x;
}
int x1 = -1;
float x2 = -0.5;
cout << abs(x1) << " " << abs(x2) << endl;
template<typename T, int N>
struct Stack {
T a[N];
int tot;
void pop() {tot--;}
T& top() {return a[tot];}
void push(const T &x) {a[++tot] = x;}
};
Stack<int, 100> S1;
Stack<float, 10> S2;
S1.push(1);
S2.push(0.5);
S1.top()++;
cout << S1.top() << " " << S2.top() << endl;

傳遞函式

  • using 在 C++11 中有著“重新命名、代替”的用處。

  • 利用 using 歸納一個函式並作為引數傳遞。

用法:using Func = int (&)(int, int)

  • 例如:
int my_add(int x, int y) {return x+y;}
int my_xor(int x, int y) {return x^y;}
using Func = int (&)(int, int);
int sum(int *a, int n, Func op) {
    int ret = 0;
    for (int i=0; i<n; i++)
    ret = op(ret, a[i]);
    return ret;
}
const int N = 4;
int a[N] = {1,2,3,4};
cout << sum(a, N, my_add) << " " << sum(a, N, my_xor) << endl;

除錯

assert 用法:assert(條件語句)。當條件成立時什麼也不做,不成立時報錯,返回該 assert 語句的行標號,並退出程式。

  • 例如:
const int N = 5;
int a[N] = {3, 2, 1, 0, -1};
for (int i=0; i<N; i++)
assert(a[i]>=0);

\(i=4\)assert 會報錯。

exit 用法:exit(返回值)。結束程式並返回。

相關文章