標準C ++ライブラリの基本概念

この記事では、標準C ++ライブラリの基本概念を定義します。 将来参照するために与えられます。



C ++標準ライブラリの最大の部分は、STL(標準テンプレートライブラリ)です。 STLライブラリには、主に5つのタイプのコンポーネントが含まれています。









すべてのコンポーネントは多くの要件を満たしているため、互いによく一致しています。



コンテナの定義から、ユーザーデータ構造はコンテナであることがわかります。 私たちの場合、 コンテナには 、リスト、ベクター、辞書などの標準データ構造があります。 コンテナの正式な要件は非常に広範囲ですが、基本的なルールは要素へのアクセスです。 コンテナ要素へのアクセスは、特別なオブジェクト- イテレータ (以下を参照)を介して実行されます 。 コンテナの要素がメモリ内にどのように配置されているかはわからないかもしれませんが、イテレータを順番に繰り返し処理でき、各要素が要素へのアクセスを提供することは確かです。 最初の要素を指すイテレータは、 イテレータのbegin()メソッドを使用して取得できます コンテナ。 最後の要素を指す反復子は、 反復子のend()メソッドを使用して取得できます コンテナ。 言い換えると、イテレータは半間隔 (またはセグメント)に配置され、正式には[begin、end)と書くことができます。 コンテナ宣言の例:



struct a_container { struct an_iterator; an_iterator begin(); an_iterator end(); };
      
      





予想されるC ++ 20標準では、半範囲 - 範囲をカプセル化する構造の使用が推奨されています




イテレータは、コンテナの要素へのアクセスを提供し、それらの要素をソートできるようにするオブジェクトです。 イテレータはコンテナのプロパティです。 C ++標準ライブラリの最初の実装では、コンテナ要素へのポインタとしてイテレータが実装されていました。 最新の実装では、これはコンテナオブジェクトへのポインタをカプセル化するクラスです。



イテレータの主な要件は、逆参照演算子と増分演算子の存在です。 以下は、イテレータを使用したコンテナ宣言です。



 template<typename TYPE> struct a_container { struct an_iterator { void operator++(); TYPE& operator*(); }; an_iterator begin(); an_iterator end(); };
      
      





標準のアルゴリズムよりもアルゴリズムの定義を改善することはできません。 アルゴリズムとは、有限数のステップで望ましい結果をもたらす一連のアクションです



STLの場合、アルゴリズムは、反復子の半間隔を入力パラメーターとして取るテンプレート関数によって実装されます。 これらのアルゴリズムの一般的なシグネチャは次のとおりです。



 template<typename ITERATOR, typename RESULT> RESULT an_algorithm(ITERATOR first, ITERATOR last, ...);
      
      





クラス宣言では、演算子()をオーバーライドできます。 この演算子がクラスでオーバーライドされると、このクラスのオブジェクトは関数のプロパティを受け取ります(関数として使用できます)。 そのようなオブジェクトは、関数またはファンクターと呼ばれます。 関数に「メモリ」が必要な場合、関数へのポインタを置き換えるだけでなく、ファンクターを使用すると便利です。

C ++ 11標準からは、ファンクター(ラムダ関数)の短い表記法の可能性があります。
ファンクターに特別な要件はありません。 場合によっては、ファンクター関数からの継承が必要になることがあります(C ++ 11標準まで-unary_functionまたはbinary_function)。 ファンクターの実装の小さな例:



 template<typename TYPE> struct plus{ TYPE operator ()(const TYPE& p1, const TYPE& p2) const{ return p1 + p2; } };
      
      





STLは、インターフェイスを適切なものに変換する多くのクラスと関数(関数)も提供します。 特に、コンテナに基づいてスタックを実装するスタックアダプタがあります。 例として、バイナリ関数の単項関数へのアダプターを考慮することができます(現在、この関数はC ++標準では非推奨です)。



 template<typename BIDIRECTIONAL_FUNCTION, typename TYPE> class bind1st { BIDIRECTIONAL_FUNCTION _bf; TYPE _first; public: bind1st(BIDIRECTIONAL_FUNCTION bf, TYPE first): _bf(bf), _first(first) {} TYPE operator()(const TYPE& p) const { return _bf(_first, p); } };
      
      





独立した読書のために



  1. GitHubのC ++ 20ドラフト
  2. C ++リファレンス
  3. C ++アプリケーション開発
  4. Range-v3、標準の提案



All Articles