The Modern C++ Challenge 第1章

「The Modern C++ Challenge」 に挑戦してます。

amazon: The Modern C++ Challenge

最新の C++ に関する本です。
C++17 プログラミング力を鍛える100 問」という副題がついてます

PDF版が下記からダウンロードできます。

vdoc: Download The Modern C++ Challenge

回答のソースコード Github に公開されてます。

github: The-Modern-Cpp-Challenge

下記のウェブサイトに挑戦した人の感想が載ってます。

Modern C++ チャレンジ 読書ノート

Modern C++チャレンジ 、一章、読書メモ

まずは目次を読んでみる。
プログラマが知るべき12の分野という感じですね。

01 数学の問題
02 言語機能
03 文字列と正規表現
04 ストリームとファイルシステム
05 日時
06 アルゴリズムとデータ構造
07 並行性
08 デザイン パターン
09 データのシリアル化
10 のアーカイブ、画像、およびデータベース
11 暗号
12 ネットワーキングとサービス

次に第1章の目次を見てみる。
馴染みのない用語がならんいる。
目次だけでギブアップする人がいそうだな。

01 3または5で割り切れる正の整数の総和
02 最大公約数
03 最小公倍数
04 与えられた正の整数より小さい最大の素数
05 セクシー素数
06 過剰数
07 友愛数
08 アームストロング数
09 素因数分解
10 グレイコード
11 ローマ数字に変換
12 最長コラッツ数列
13 πの計算
14 ISBNの検証

ソースコードが公開されているので、斜め読みして実行してみる。

コンパイルエラーになるものがあった。

例えば 第8問では下記のエラーとなる。

member named 'invoke' in namespace 'std'

c++17にて追加された std::invoke が使われているためです。
コンパイルオプションとして -std=c++17 が必要です。
CMakeLists.txt に下記を追加する。

target_compile_options(problem_08 PUBLIC -std=c++17)

cpprefjp: std::invoke

cpprefjp: C++17の機能を有効にする

一通り実行できたので、
Modern C++ に着目して、ソースコードを読んでみる。

最大公約数 と最小公倍数は C++17から標準関数になっている。
それを使わずアルゴリズムに従って記述してます。

cpprefjp: std::gcd

第8問で std::invoke が使われている。

cpprefjp: std::invoke

第14問で ラムダ式 が使われている。

cpprefjp: ラムダ式

それ以外は Modern C++ というところはなかった。

C++ で記述する利点は何かと思い、C言語で書き直してみた。

第10問にて2進数で表示している。
C++ では std::bitset を使い簡潔に記述できる。

cpprefjp: bitset

C には そういう機能はないので、下記のウェブサイトを参考に関数を自作した。

C言語入門: 10進数を2進数に変換

第12問にて100000000 という大きな配列を使っている。
C では Segmentation Fault になる場合がある。
C++ の std::vector では問題なし。

wikipedia: セグメンテーション違反

cpprefjp: std::vector

C言語に利点があるものもあった。
第8問にて実行時間を表示している。
C言語の方が速かった。
C++ にオーバーヘッドがあるのかな。

それ以外は C++ と C に差はなかった。
C++ も算術計算など大部分は C と同じですから。

第1章 のソースコードGithub に公開した。
https://github.com/ohwada/The-Modern-Cpp-Challenge/tree/main/The-Modern-Cpp-Challenge/Chapter01