第1章の「C ++ 11/14高度なプログラミングBoostライブラリクエスト」、新しいC ++言語(III)学習記録
1.7関数型プログラミング
関数型プログラミングは、λ計算に基づいている並列プログラミングパラダイム、数学関数を計算するの組み合わせとして算出処理プロセス指向のプログラミングオブジェクト指向と汎用プログラミングです。
1.7.1ラムダ式
基本的な形:
[](paramsは){...}
[]演算子は関数のパラメータは、括弧内にブレースされ、リードラムダ式と呼ばれる体の関数であり、任意のC ++文。
ラムダ式と呼ばれるタイプの閉鎖は、直接書き込むことはできません、オートメモリ機能型推論を使用する必要があることが多いです。例としては、次のとおりです:
[ルート@ 192 C ++ 11]#猫lambdademo.cpp
する#include <iostreamの>
する#include <ベクトル>
の#include <アルゴリズム>
の#include <ストリング>
名前空間STDを使用して、
F1 =オート[](INT X)
{
リターンX * X;
}; //終了表現は、文はセミコロンで終了する必要があります
オートF2 = [](文字列s)
{
COUT << "ラムダ:" << S << ENDL。
}。
オートF3 = [](int型のx、int型Y)
{
リターンX <Y。
}。
INTメイン()
{
COUT << F1(3)<< ENDL。
F2( "ラムダデモ");
COUT << F3(1,5)<< ENDL。
ベクター<整数> V = {1,3,5,7}。
for_each(v.begin()、v.end()、[](INT X){COUT << X << "";});
for_each(v.begin()、v.end()、[](INT&X){IF(X> 3){X * = 2;}})。
0を返します。
}
[ルート@ 192 C ++ 11]#G ++ lambdademo.cpp -o lambdademo -std = C ++ 11
1.7.2キャプチャ外部変数
完全な宣言構文ラムダ式は次のようになります。
[キャプチャ](paramsは)mutable->タイプ{...}
キャッチリストが呼び出されたキャプチャは、あなたが表現の範囲外の変数を取り込むことができる、通常の関数または最大でオブジェクトの機能と異なる点は、直接関数の使用、。
キャプチャキャプチャリストは、コンマで区切って複数のエントリを持つことができ、ルールは次の通りです:
[]:,,いいえ、任意の外部の変数にアクセスすることができない機能をキャプチャ
[=]:値(コピー)することによりすべての外部変数へのアクセスが、変更されないことができる機能をキャプチャします
[&]:リファレンスがアクセスをすべての外部変数、関数本体をキャプチャし、(無効慎重に参考のために)変更
【VaRは]:値によって外部変数、アクセス可能な機能をキャプチャする(コピー)が、変更されません
[&VaRは]:参照がアクセスする外部変数、関数本体をキャプチャおよび変更します
[この]:このポインタをキャプチャするには、クラスのメンバ変数とメンバ関数にアクセスすることができます
[=、&ヴァー]:参照変数VARを捕捉する、他の外部変数キャプチャ値
[&、VaRは]:キャプチャ変数の値varが、他の外部変数への参照をキャプチャするために使用しました
例えば、ラムダ式はまた、値が変数は、インビボ機能に変更することができる可能に、例外に追加され、それは捕捉され、キーワード可変を使用して変更することができ、これは、外部変数の影響を受けることなく、内部コピーされます。
[ルート@ 192 C ++ 11]#猫のlambda_multable_demo.cpp
する#include <iostreamの>
の#include <アルゴリズム>
std名前空間を使用しました。
メインINT()
{
int型X = 0;
オートF1 = [=](){++可変Xを返す;}; //内部のみ修正、外部変数の影響を受けることなく
F1();
COUT << "multable X:" X << ENDL <<;
//自動F2 = [=](){リターンX ++;}; //コンパイルエラー、読み取り専用変数'X'のINCREMENT
// F2();
// << COUT "値x:" << X <<てendl;
自動F3 = [b](){リターン++ X;};
F3();
裁判所未満<< "REF X:" << X <<てendl;
0を返します。
}
[ルート192 C ++ 11]#G ++ lambda_multable_demo.cpp -o lambda_multable_demo -std = C ++ 11
#./lambda_multable_demo [192 C ++ 11 @ルート]
multable X:0
REF X:1
1.8並行プログラミング
ローカルストレージは、プロセスの複数のインスタンスを持つ変数を参照し、各スレッドは完全に独立し、ローカライズされたコピー・スレッド、お互いを乱すことなく、変数を読み書きする複数のスレッド、完全競争を避けるため、トラブルの同期を持つことになりますスレッド例えば:
[ルート@ 192 C ++ 11]#猫thread_local_demo.cpp
する#include <iostreamの>
する#include <アルゴリズム>
の#include <スレッド>
名前空間STDを使用して、
INTメイン()
{
にextern intはX;
静的int型、Y = 0。
thread_local整数Z = 0。
オートF = [b](){++ Y、Z ++; COUT << Y << "" << Z << ENDL;};
スレッドT1(F)
スレッドT2(F)
t1.join();
t1.join();
COUT << << Y "" Z << << ENDL;
戻り0;
}
[ルート11 @ 192 C ++] -o thread_local_demo thread_local_demo.cpp#G ++ - C ++ 11 -lpthread = STD。
[C ++ルート11 192 @。]#./thread_local_demo
./thread_local_demo:/lib64/libstdc++.so.6:(./thread_local_demoで必要)バージョンGLIBCXX_3.4.22 `」が見つかりません/ / Redhat7.3アップグレードされていないのglibcの場合は、スレッド機能をサポートしていない、glibcのジョブのバージョンをアップグレードする必要があります。
実際の出力は、メインスレッドの2,1 2,0への出力の1,1スレッドT1 T2の実際のスレッド実際の出力であります
むしろ特殊変数thread_localライフサイクル、すなわち、唯一ライフサイクルのねじが有効であり、スレッドデストラクタの終了時に、スレッド開始時に設定されています。
あなたはまだ使用ミューテックスや他の保護メカニズムに必要なスレッド間で共有リソースへのアクセスを必要とする場合、スレッドは、分離ストレージを必要とする場合にのみ適用することがthread_local。
1.9セキュリティ指向プログラミング
1.9.1例外なく保証
ボイドFUNC()noexcept {} //関数は、例外がスローされない決定します
1.10その他
C ++ 98では、テンプレートパラメータリストは、2つの連続する直角ブラケットを持つことができません>>またはコンパイラが、右シフト演算子、書き込みで結果いくつかの複雑なクラステンプレート、テンプレートパラメータとしてそれを解釈しますこれは、リストのスペースより>終わりで区切られますが、C ++ 11月14日、顔>>でこの欠陥を補うしなければならない、優先順位は、終了タグテンプレートテンプレートパラメータリスト内の文で説明します。