一般的に、プログラミングでは車輪の再発明はしたくないものです。 多くの標準的なアルゴリズムには、すでに誰かが代わりに実装してくれているものがあります。
他のファイルの内容を取り込むために、C++ではincludeディレクティブを使います。
これらのインクルードは、ファイルの先頭に書きます。
コンパイルの際、ディレクティブのある行は、対応するファイルの内容に置き換えられます。
インクルード後も、名前空間は元のファイルと同じ状態で保たれます。
標準ライブラリには、よく使われる多くの関数、アルゴリズム、データ構造が用意されています。
標準ライブラリはstd名前空間を使います。
その一例が、Cの数値計算ライブラリcmathです。
よく使われる数学演算が多数用意されています。
#include <cmath>
int cube_me(int a) {
// raise `a` to the third power
return std::pow(a, 3);
}
標準ライブラリは、二重引用符"ではなく山括弧<>でインクルードします。
違いは、コンパイラーがそれぞれのファイルを探す場所にあります。
山括弧を使う場合は現在のプロジェクト内の検索が省略され、システムのインクルードディレクトリから直接探し始めます。
ローカルのファイルをインクルードしたい場合は、二重引用符を使います:#include "myfile"
C++のstringは、テキストを文字(アルファベット、数字、句読点など)の並びとして表す、変更可能なオブジェクトです。
文字列は、その文字列のメソッドを呼び出すことで操作します。
C++では、文字列型とそれに関連する関数は、使う前に文字列ライブラリからインクルードする必要があります。
ファイルの先頭に#include <string>を追加すれば、そうできます。
これにより、それらはstd名前空間に追加されます。
文字列型の完全修飾名はstd::stringです。
文字列リテラルには、二重引用符"を使います。
#include <string>
std::string w_berry_quote{"A well-made sentence, I think, is a thing of beauty."};
+演算子を使って、文字列を連結できます。
std::string original_title{"The School of Rock"};
std::string sequel_indicator{"Electric Boogaloo"};
std::string next_movie_title = original_title + " 2: " + sequel_indicator;
文字列ライブラリを使うには、オブジェクトに属する関数を呼び出せることを知っておく必要があります。 これをメンバー関数と呼びます。 シラバスの後半で、メンバー関数とそれに関連するクラスの概念についてさらに学びます。
std::string qualification{"awesome"};
// 1st argument: from the index to the end of the string:
std::string who_is_awesome = qualification.substr(5);
// => "me"
// 2nd optional argument for the length:
std::string material{"haunted books"};
std::string ghost = material.substr(8, 3);
// => "boo"
find関数もとても便利です。
文字列のメンバー関数として呼び出し、引数に文字列を取ります。
findは、文字列中で_最初_に見つかった位置を、0から始まるインデックスで返します。
std::string new_release{"apple released a new app!"};
new_release.find("app");
// => 0
new_release.find("e");
// => 4
この演習では、ログに記録されたレポートの行を処理します。
各ログ行は、"[<LEVEL>]: <MESSAGE>"という形式の文字列です。
ログレベルは次の3つです。
INFOWARNINGERRORタスクは3つあり、どれもログ行を受け取って、それを使って何かを行うものです。
log_line::messageメソッドを実装しましょう。ログ行のメッセージを返します。
log_line::message("[ERROR]: Invalid operation")
// => "Invalid operation"
log_line::log_levelメソッドを実装しましょう。ログ行のログレベルを返します。ログレベルは大文字で返します。
log_line::log_level("[ERROR]: Invalid operation")
// => "ERROR"
log_line::reformatメソッドを実装しましょう。このメソッドはログ行を整形し直し、メッセージを先に、ログレベルをそのあとに括弧(())で囲んで置きます。
log_line::reformat("[INFO]: Operation completed")
// => "Operation completed (INFO)"