The Modern C++ Challenge 第3章

The Modern C++ Challenge 第2章 の続きです。

今回は第3章に挑戦します。

まずは目次を読む。

第3章 文字列と正規表現

23 バイナリから文字列への変換
24 文字列からバイナリへの変換
25 記事のタイトルを大文字にする
26 区切り文字で区切られた文字列を結合する
27 可能な区切り文字のリストを使用して文字列をトークンに分割する
28 最長回文部分文字列
29 ナンバープレートの検証
30 URL 部分の抽出
31 文字列の日付を変換する

問題文を読む。

問23. バイナリから文字列への変換
ビット整数 (配列やベクトルなど) の範囲を指定すると、入力データの 16 進数表現を含む文字列を返す関数を作成します。 この関数は、大文字と小文字の両方のコンテンツを生成できる必要があります。

ソースコードを斜め読みして実行する。 コンパイルエラーになるものがある。 CMakeLists.txt を修正する。

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

第23問 第29問 にて std::cbegin を使っている。

cpprefjp: std::cbegin

第25問 第26問 にて 「sリテラル」を使っている。

cpprefjp: sリテラル

第30問 にて std::optional を使っている。

cpprefjp: std::optional

C++ の文字列クラスに依存しているソースになってます。

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

C++ は C に比べ文字列の操作が強化されている。 そのことを再認識することになった。

例えば、C++ では 文字列の配列は std:;string std::vector を使って簡潔に記述できる。 C では malloc を使うなど工夫が必要となる。

第29問 第30問 第31問は、正規表現の問題である。

C++ では を使って簡潔に記述できる。 C では <regex.h>を使って書き直したところ、 記述量は増えた。

C++ では生文字列リテラルが使えるので、 エスケープ記号を含む正規表現が、素直に記述できる。 C ではエスケープ記号は使えないので、正規表現の記述を変更する必要があった。

cpprefjp: 生文字列リテラル

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