最初の章では、関数型プログラミングを紹介します
関数型プログラミングはプログラミングパラダイムです。ここで関数は、第一級オブジェクトであり、他の変数の関数に支払うことができる、それが他のパラメータや関数の戻り値として使用することができます。関数型プログラミングの要件は、ステートメントを使用していない、唯一の表現を使用しています。
関数型プログラミングは、宣言型プログラミングと命令型プログラミングそれ異なっています。コマンドが何かをするためにコンピュータを指揮することを意味し、それは明らかに、各ステップを実行する必要がある結果を計算することです。声明のあなた手段何をすべきかの命令は、その後、タスクは、プログラミング言語を行う方法を見つけることです、通常、ステップバイステップでそれを行うには、コンピュータに指示するのではなく、あるものを定義しています。
不可欠と宣言型プログラミング例を理解します
想像して、あなたはファイルリストを受け取り、ファイルの行数を計算する関数を書きます。
命令型のアプローチは、次のようになります。
- 各ファイルを開きます。
- カウントするローの数を格納する変数の定義
- たびに、文字によって文字がファイルを読み込む、改行に直面したとき、カウント++
- ファイルの値の終わりに、店舗数
ここでは、コードは次のようになります。
auto count_lines_in_file(const std::vector<std::string>& files) -> std::vector<int>
{
std::vector<int> result;
int c = 0;
for (const auto& file : files)
{
int count_lines = 0;
std::ifstream in(file);
while (c = in.get())
{
if (c == '\n')
count_lines++;
}
result.push_back(count_lines);
}
return result;
}
しかしながら、上記のコード、エラーが発生しやすい、そのような未初期化変数として、もし、条件等があります。
次のアプローチが使用するのstd ::回数アルゴリズムと入力イテレータは、コードを簡素化ストリーム:
int count_lines(const std::string& file)
{
std::ifstream in(file);
// 像对容器一样,也可以对流迭代器使用stl算法
return std::count(std::istreambuf_iterator<char>(in), std::istreambuf_iterator<char>(), '\n');
}
auto count_lines_in_file(std::vector<std::string>& files) -> std::vector<int>
{
std::vector<int> result;
for (auto& file : files)
{
result.push_back(count_lines(file));
}
}
上記の解決策では、あなたは、count_linesが達成されるか気にしないcount_linesは、単にファイルの行数を指摘します。これは、関数型プログラミングの意図です。
私たちは、STDを使用して、この時間は::変換近い関数型プログラミングに、もう一度コードを単純化してみましょう:
auto coutn_lines_in_file3(std::vector<std::string>& files)
{
std::vector<int> result;
std::transform(files.begin(), files.end(), result.begin(), count_lines);
return result;
}
C ++ 20には、再度ライブラリの使用を簡素化することができます:
auto count_lines_in_file4(std::vector<std::string>& files)
{
// 使用管道操作符(c++20)
return files | std::transform(count_lines);
}