2009-03-30 10 views
0

地図タイプは次の型を持つテンプレートパラメータとしてコンパレータを受け入れる理由:私たちはCompare述語を渡すことができますテンプレートパラメータの一つとしてのstd ::マップデザイン:マップは、STLから

std::map< Key, Data, Compare, Alloc > 

は、なぜマップテンプレートパラメータとしてこの述語を受け入れますコンストラクタ内のオブジェクトとしてではありませんか?

コンストラクタでboost::function< bool, const T&, const T& >のようなものとより柔軟なインターフェイスを持つことができます。
もちろん私はSTLの設計時にブーストは存在しませんが、設計者はboost :: functionと同様のものを作成することができるということを強調しています。

私はそれにはいくつかの深い理由があると信じています。ダミーの質問には申し訳ありません

EDITED
、マップは同じ働かを持っている:)
私の質問は、あなたの答えの後に意味を持っていません。

答えて

5

地図DOESにはこのようなコンストラクタがあります。 C++標準のセクション23.3.1から:

explicit map(const Compare& comp = Compare(), 
const Allocator& = Allocator()); 
+0

+1 - ありがとうございます。 しかし、申し訳ありませんが、私は彼があなたより早かったので、ロブの答えを受け入れました。 – bayda

+1

実際、Neilの答えは約3分早いので、それ以外の場合は同様に役立つ回答のために提出時間をタイブレーカーとして使用している場合は、この回答に同意してください。 –

+0

本当に問題ではありません! –

3

boost::functionは多型であるため、インライン化できません。 STLの設計は、コンパイラが拡張されたテンプレートで簡単なコードのインライン展開を行う最大の可能性を目指しています。また、多形化が必要な場合はboost::functionを使用してstd::mapとの比較を簡単に行うことができます。

+0

良い点ですが、標準的な解決策はより良いです))助けてくれてありがとう。 – bayda

+0

「深い理由」についてのあなたの質問の第二の部分は完全に有効で、ダムではないと思います! :)ところで、std :: tr1 :: functionはすでに準標準です。http://en.wikipedia.org/wiki/Technical_Report_1をご覧ください。 –

7

テンプレート引数は述語ではなく、値のタイプです。値は、コンストラクタの引数としてに指定できます。タイプに一致する任意の値を指定できます。指定されているように、デフォルトのタイプはstd::less<Key>ですが、ほとんど値が1つのみですが、boost::functionなどのCompare引数に独自のタイプを指定してから、さまざまな値を使用してマップオブジェクトの動作を制御する必要があります。

+0

私はこのサイトの初心者であり、授与に関する規則を知らない。しかし、私はそれがスピードに依存していると思う。とにかく、あなたの答えをありがとう。 – bayda

2

比較オブジェクトを使用すると、実行時コストが発生します。オブジェクトを格納する必要があり、比較はポインタを使用して行う必要があります。クラスを使用することで、例えばintキーを使用する場合など、比較を単一の式に単純化することができます。標準ライブラリの目的は、優れたC++プログラマが独自に生成するものよりも効率的であることでした。

+0

'標準ライブラリの目標は、優れたC++プログラマが独自に生成するものよりも効率的であるということでした。 +1はそれを覚えています。 – bayda

関連する問題