modern-cpp-tricks

所属分类:Leetcode/题库
开发工具:Others
文件大小:2KB
下载次数:0
上传日期:2022-03-27 11:56:57
上 传 者sh-1993
说明:  现代CPP技巧通常在编码面试和竞争编程中有用
(Modern CPP Tricks often useful in Coding Interviews and Competitive Programming)

## Introduction This is the list of modern CPP tricks often used in Coding Interviews and Competitive Programming. If you like Rachit's work, you can follow at - - Discord - https://bit.ly/discord-rachit - Programming YouTube Channel - https://bit.ly/rachityoutube ## Contents: - [No more nested `min(x, min(y, ...))`](https://github.com/rachitiitr/modern-cpp-tricks/blob/master/#no-more-nested-minx-miny-) - [JavaScript like Destructuring using Structured Binding in C++](https://github.com/rachitiitr/modern-cpp-tricks/blob/master/#javascript-like-destructuring-using-structured-binding-in-c) - [Powerful Logging and Debugging](https://github.com/rachitiitr/modern-cpp-tricks/blob/master/#powerful-logging-and-debugging) - [How debug macros work?](https://github.com/rachitiitr/modern-cpp-tricks/blob/master/#how-debug-macros-work) - [The Problem with this macro - its not scalable](https://github.com/rachitiitr/modern-cpp-tricks/blob/master/#the-problem-with-this-macro---its-not-scalable) - [Solution using a powerful macro](https://github.com/rachitiitr/modern-cpp-tricks/blob/master/#solution-using-a-powerful-macro) - [Generic Reader and Writer for multiple variables and containers](https://github.com/rachitiitr/modern-cpp-tricks/blob/master/#generic-reader-and-writer-for-multiple-variables-and-containers) - [Decorators in C++ and Multiple Parameters](https://github.com/rachitiitr/modern-cpp-tricks/blob/master/#decorators-in-c-and-multiple-parameters) - [Live Demo on YouTube](https://github.com/rachitiitr/modern-cpp-tricks/blob/master/#live-demo-on-youtube) - [Printing as many variables in one line](https://github.com/rachitiitr/modern-cpp-tricks/blob/master/#printing-as-many-variables-in-one-line) - [Powerful decorator functions in C++](https://github.com/rachitiitr/modern-cpp-tricks/blob/master/#powerful-decorator-functions-in-c) - [Exploiting decorators by nesting them](https://github.com/rachitiitr/modern-cpp-tricks/blob/master/#exploiting-decorators-by-nesting-them) ## No more nested `min(x, min(y, ...))` Use initializer list and `std::min` and `std::max` to make life easy ```cpp small = min(x, min(y, min(z, k))); // the old way small = min({x, y, z, k}); // life is easy ``` ## JavaScript like Destructuring using Structured Binding in C++ ```cpp pair cur = {1, 2}; auto [x, y] = cur; // x is now 1, y is now 2 // no need of cur.first and cur.second array arr = {1, 0, -1}; auto [a, b, c] = arr; // a is now 1, b is now 0, c is now -1 ``` ---------------- ## Powerful Logging and Debugging ### How debug macros work? Straight to the point, I have often used the `debug` macro which stringifies the variable names and their values. ```cpp #define deb(x) cout << #x << " " << x int ten = 10; deb(ten); // prints "ten = 10" ``` This is often useful in debugging. ### The Problem with this macro - its not scalable However, when you have multiple variables to log, you end up with more `deb2` and `deb3` macros. ```cpp #define deb(x) cout << #x << " " << x #define deb2(x) cout << #x << " " << x << " " << #y << " " << y #define deb3(x, y, z) cout << #x << " " << x << " " << #y << " " << y << " " << #z << " " << z ``` This is not scalable. ### Solution using a powerful macro Here is the solution using variadic macros and fold expressions, ```cpp #define deb(...) logger(#__VA_ARGS__, __VA_ARGS__) template void logger(string vars, Args&&... values) { cout << vars << " = "; string delim = ""; (..., (cout << delim << values, delim = ", ")); } int xx = 3, yy = 10, xxyy = 103; deb(xx); // prints "xx = 3" deb(xx, yy, xxyy); // prints "xx, yy, xxyy = 3, 10, 103" ``` ---------------- ## Generic Reader and Writer for multiple variables and containers ```cpp template void read(T &...args) { ((cin >> args), ...); } template void write(string delimiter, T &&...args) { ((cout << args << delimiter), ...); } template void readContainer(T &t) { for (auto &e : t) { read(e); } } template void writeContainer(string delimiter, T &t) { for (const auto &e : t) { write(delimiter, e); } write("\n"); } ``` ### Usage ```cpp // Question: read three space seprated integers and print them in different lines. int x, y, z; read(x, y, z); write("\n", x, y, z); // even works with variable data types :) int n; string s; read(n, s); write(" ", s, "has length", n, "\n"); // Question: read an array of `N` integers and print it to the output console. int N; read(N); vector arr(N); readContainer(arr); writeContainer(" ", arr); // output: arr[0] arr[1] arr[2] ... arr[N - 1] writeContainer("\n", arr); /** * output: * arr[0] * arr[1] * arr[2] * ... * ... * ... * arr[N - 1] */ ``` ---------------- ## Decorators in C++ and Multiple Parameters ### Live Demo on YouTube - Check the online demo on YouTube [here on Rachit's channel](https://github.com/rachitiitr/modern-cpp-tricks/blob/master/https://www.youtube.com/watch?v=ZhWyNjPGXD4). ### Printing as many variables in one line ```cpp template void printer(T&&... args) { ((cout << args << " "), ...); } int age = 25; string name = "Rachit"; printer("I am", name, ',', age, "years old"); // ^ This prints the following // I am Rachit, 25 years old ``` ### Powerful decorator functions in C++ ```cpp template auto debug_func(const F& func) { return [func](https://github.com/rachitiitr/modern-cpp-tricks/blob/master/auto &&...args) { // forward reference cout << "input = "; printer(args...); auto res = func(forward(args)...); cout << "res = " << res << endl; return res; }; } debug_func(pow)(2, 3); // ^ this automatically prints // input = 2 3 res = 8 ``` ### Exploiting decorators by nesting them Lets define another decorator `beautify` as follows. ```cpp template auto beautify(const F& func) { return [func](https://github.com/rachitiitr/modern-cpp-tricks/blob/master/auto &&...args) { // forward reference cout << "========" << endl; func(forward(args)...); cout << "========" << endl; }; } beautify(debug_func(pow(2, 3))); // ^ this now prints // ======== // input = 2 3 res = 8 // ======== ``` Its amazing how much you can do by writing such generic decorators and nest them. Think about decorators like `log_time` that calculates the time taken for a given function.

近期下载者

相关文件


收藏者