「ライブラリ」とは?
「オブジェクトファイル」を束ねて作るものには実行ファイルがありますが、「ライブラリ」という形で出力もできます。
ライブラリの種類
- 静的ライブラリ
- 動的(共有)ライブラリ(DDL)
静的ライブラリ
本当に、オブジェクトファイルを束ねただけのもので、オブジェクトファイルと同様にリンクを行えます。
プログラムの実行前にリンク作業を行います。
メリット
ビルド時に、関数の使い方が間違っていればエラーになるので事前にバグをつぶすことができます。
また、exeの中に取り込まれるので誤ってライブラリがユーザーに消される心配もありません。
動的(共有)ライブラリ(DDL)
「実行ファイル」と「静的ライブラリ」の中間のような存在です。「ダイナミックリンクライブラリ(DDL)」とも呼びます。
単独で実行させることはできないですが、実行中のプログラムから参照させることができます。
プログラムの実行中にリンクを行います。
メリット
プログラムのリリース後でも、DLLさえ置き換えればアプリの挙動を変えることができるので拡張性が高いです。
DLLの作成をするには?
Visual C++であれば、Visual Studioで「ダイナミックリンクライブラリ」のプロジェクトを作成して、ビルドする必要があります。
その際に、DLLはバイナリデータなので、関数を識別させることができるようにエクスポート関数というエントリポイント的な目印をつける必要があります。
エクスポート関数を作成するには?
下記の2種類の方法があります。
- _declspec(dllexport)キーワードを使う。
- モジュール定義ファイルを使う。
作成したDLLを利用するには?
下記2つの方法があります。
- 暗黙的なリンクを使う。
- 明示的なリンクを使う。
暗黙的なリンクを使う。
DLLをVisual Studioでビルドした際に、DLLと同じ階層にLIBファイルができていると思います。
このファイルはインポートライブラリと呼ばれるもので、DLL内のエクスポート関数の位置情報が書き込まれています。
DLLは、使用するアプリのビルド時に静的にリンクが行われます。
また、これを使う際はlibだけでなく、他にはリンクするDLLや、エクスポート関数が定義されているヘッダファイルが必要になります。
明示的なリンクを使う。
プログラム中でLoadLibrary関数を使用して動的にリンクを行います。
明示的なリンクの場合は、必要なのは.dllファイルのみになります。
一般的には、DLLファイルのみのコチラを使うことが多くなるでしょう。
C++のライブラリ
C++の標準ライブラリのほとんどが「std名前空間」に属しています。
STL(標準テンプレートライブラリ)とは?
データ操作に使用できる汎用ルーチンの集まりです。大量のアルゴリズムが用意されています。
代表的なアルゴリズム
- sort
- find
- lower_bound
sort
<algorithm>の関数のsortとして提供されており、並び替えを行わせることができます。
find
線形探索(先頭から順番に並び替える手法です。)を行わせることができます。<algorithm>の関数ののfindを使えば行わせれます。
lower_bound
二分探索(先頭から順番に並び替える手法です。)を行わせることができます。これも同じく<algorithm>の関数で提供されています。
vector
複数のオブジェクトをひとまとめにするためのC++の標準ライブラリに実装されている技術です。
よく使われるのは「std::vector」というコンテナになります。
同じ型のオブジェクトをメモリ上に並べて管理することができます。
初期化方法
1 |
Vector<T> 名前 |
または
1 |
Vector<T> 名前(要素数) |
または
1 |
Vector<T> 名前{要素1,要素2,…} |
vectorのループ
下記の方法のいずれかでvectorの要素はループで取り出すことができます。
- for文を使う。
- 拡張for文を使う。
- イテレータを使う。
vectorへのアクセス方法
下記3つのアクセス方法があります。
- アドレス
- 添字
- 反復子(イテレータ)
アドレス
vectorコンテナはメモリ上に格納されているのでアドレスを使ってアクセスできる。
構文
1 2 |
&コンテナ[0] &コンテナ[0]+1 |
添字
vectorコンテナはメモリ上に格納されているので添字を使ってアクセスできる。
構文
1 2 |
コンテナ[0] コンテナ[1] |
反復子(イテレータ)
通常、std::list等のコンテナは、0番目の要素をポインタ変数にしても、それに2を足して2番目の要素にアクセスするというようなことができませんでした。(vector等のコンテナはできますが、全てのコンテナで統一されてはいません。)しかし、イテレータを使うことでそのような直感的なアクセスが可能になります。
構文
先頭要素を指す反復子
1 |
begin() |
末尾要素を指す反復子
1 |
end() |
ランダムアクセス反復子
「std::vector」等のコンテナはこちらになります。自由に場所を指定してアクセスできます。
双方向反復子
「std::list」や「std::set」等のコンテナはこちらにあたります。前後に差し引きすることでアクセスできます。
この記事へのコメントはありません。