Effective STL

50項 STL関係のwebサイトに親しもう

STL関係のwebサイトに親しもう SGI STL : https://www.sgi.com/tech/stl/ STLのオンラインリファレンスとして使えます。標準以外のコンポーネントも多数公開しています。STLport : http://www.stlport.org/ デバッグモードを備えたSTLが公開されています。Bo…

49項 STL関連のコンパイラ診断メッセージを理解できるようにしよう

STL関連のコンパイラ診断メッセージを理解できるようにしようSTLのエラーメッセージは、多くのテンプレート引数やイテレータの呼び出しを含むため読みづらくなってしまいます。 その時は、テンプレート引数やイテレータ呼び出しを読み飛ばし、何がエラーを起…

48項 常に必要なヘッダーを#includeしよう

常に必要なヘッダーを#includeしようコンパイラによって、ヘッダファイルのインクルード関係が違うことがあります。 たとえば、Aでは<vector>が<string>を#includしているが、Bだとしていないなどです。なので、必要になるであろうヘッダーをすべて#incl…

47項 書き込み専用コードの作成は避けよう

書き込み専用コードの作成は避けよう STLを使ったコードには多くの関数呼び出しがあるため、複雑なコードになりやすいです。 読みづらい書き込み専用コード(後で読むことを考えていないコード)はコメントをつけるか、分割して読みやすくなるようにします。

46項 アルゴリズムのパラメータとして関数の代わりに関数オブジェクトの使用を考えよう

アルゴリズムのパラメータとして関数の代わりに関数オブジェクトの使用を考えよう

45項 count、find、binary_search、lower_bound、upper_bound、およびequal_rangeの違いを理解しよう

count、find、binary_search、lower_bound、upper_bound、およびequal_rangeの違いを理解しよう

44項 アルゴリズムより同名のメンバ関数を優先して使おう

アルゴリズムより同名のメンバ関数を優先して使おう 連想コンテナのcountやfind、listのremoveなど、アルゴリズムと同名のメンバ関数があるときは、メンバ関数を使うべきです。 理由は、メンバ関数のほうが高速であることと、コンテナとの結びつきが緊密であ…

43項 独自に作成したループよりアルゴリズムの呼び出しを優先して使おう

独自に作成したループよりアルゴリズムの呼び出しを優先して使おう アルゴリズムはループより効率的で、エラーが発生しづらく、単純明快でわかりやすいことが多いです。 なので、独自に作成したループよりアルゴリズムの呼び出しを優先して使うべきです。

42項 less<T>がoperator<を意味することを確認しよう

lessがoperator less<T>は、Tのoperator<を呼び出します。 less<T>の動作を変えると、最小意外性の原則に反するので、動作を変えてはいけません。

41項 ptr_fun、mem_fun、およびmem_fun_refの使用理由を理解しよう

ptr_fun、mem_fun、およびmem_fun_refの使用理由を理解しよう

40項 ファンクタクラスを変換可能にしよう

ファンクタクラスを変換可能にしよう 関数アダプタを使うときには、4つのtypedef(argment_type, first_argment_type, second_argment_type, result_type)が必要です。 ファンクタクラスを関数アダプタに渡すときは、そのクラスをunary_functionかbinary_func…

39項 述語を純粋関数にしよう

述語を純粋関数にしよう

38項 値渡し用のファンクタクラスを設計しよう

値渡し用のファンクタクラスを設計しよう

37項 範囲に関する要約情報を取得するには、accumulateまたはfor_eachを使おう

範囲に関する要約情報を取得するには、accumulateまたはfor_eachを使おう

36項 copy_ifの正しい実装について理解しよう

copy_ifの正しい実装について理解しよう

35項 mismatchまたはlexicographical_compareを使って、大文字小文字を区別しない単純な文字列比較を実装しよう

mismatchまたはlexicographical_compareを使って、大文字小文字を区別しない単純な文字列比較を実装しよう この項のまとめは省略します。

34項 ソート済み範囲を必要とするアルゴリズムに注意しよう

ソート済み範囲を必要とするアルゴリズムに注意しよう

33項 ポインタのコンテナには注意してremove風アルゴリズムを使おう

ポインタのコンテナには注意してremove風アルゴリズムを使おう 生のポインターのコンテナにremove風アルゴリズムを使うと、リソースリークが起こります。 スマートポインタのコンテナを生のポインターのコンテナの代わりに使えば、リソースリークを防げます。

32項 本当に削除したい場合は、remove風アルゴリズムのあとにeraseを使おう

本当に削除したい場合は、remove風アルゴリズムのあとにeraseを使おう

31項 ソートの選択肢を知っておこう

ソートの選択肢を知っておこう

30項 出力先範囲の大きさを確認しよう

出力先範囲の大きさを確認しよう

29項 1文字ごとの入力にはistreambuf_iteratorの使用を考えよう

1文字ごとの入力にはistreambuf_iteratorの使用を考えよう

28項 reverse_iteratorの基底iteratorの使い方を理解しよう

reverse_iteratorの基底iteratorの使い方を理解しよう

27項 コンテナのconst_iteratorをiteratorに変換するには、distanceとadvanceを使う

コンテナのconst_iteratorをiteratorに変換するには、distanceとadvanceを使う

26項 const_iterator、reverse_iterator、const_reverse_iteratorよりiteratorを優先的に使おう

const_iterator、reverse_iterator、const_reverse_iteratorよりiteratorを優先的に使おう insertとeraseは常にiteratorを必要とします。必要がない限り、わざわざconst_iteratorやreverse_iterator、const_reverse_iteratorを使う必要はありません。

25項 標準以外のハッシュコンテナに慣れよう

標準以外のハッシュコンテナに慣れよう STLには、ハッシュコンテナがありません。(C++11では、unordered_set, unordered_multiset, unordered_map, unordered_multimapが追加されました。) SGI STLやSTLportにはハッシュコンテナが用意されています。

24項 効率を重視するときは、map::operator[]とmap::insertの選択に注意しよう

効率を重視するときは、map::operator[]とmap::insertの選択に注意しよう

23項 連想コンテナをソート済みvectorに置き換えることを考えよう

連想コンテナをソート済みvectorに置き換えることを考えようソート済みvectorが連想コンテナより優れている点は、メモリ使用量が少ないことと参照の空間的局所性が高いことです。 欠点は、常にvectorをソート済みにしておかなくてはならないということです。…

22項 setとmultisetのキーのインプレース変更を避けよう

setとmultisetのキーのインプレース変更を避けよう

21項 等しい値に対して比較関数が常にfalseを返すようにしよう

等しい値に対して比較関数が常にfalseを返すようにしよう