0

STL のマップ タイプには次のタイプがあります。

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

述語を渡すことができるテンプレート パラメーターの 1 つとしてCompare、マップがこの述語をコンストラクターのオブジェクトとしてではなく、テンプレート パラメーターとして受け入れるのはなぜですか?

boost::function< bool, const T&, const T& >コンストラクターのようなものとのより柔軟なインターフェースを持つことができます。
もちろん、STL が設計されたときはブーストが存在しないことを理解していますが、デザイナーはブースト::関数で同様のものを作成できます。

それにはいくつかの深い理由があると思います。

編集済みダミーの質問で申し訳
ありませんが、マップには同じ可能性があります:)
私の質問は、回答後に意味がありません。

4

4 に答える 4

7

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

于 2009-03-30T22:23:42.787 に答える
5

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

explicit map(const Compare& comp = Compare(),
const Allocator& = Allocator());
于 2009-03-30T22:20:51.013 に答える
3

はポリモーフィックであるためboost::function、インライン化できません。STL の設計は、コンパイラがコードのインライン化を行う可能性を最大限に高めることを目的としています。これは、展開されたテンプレートでは簡単です。また、ポリモーフィックにする必要がある場合boost::functionは、比較を提供するために使用する決定を簡単に行うことができます。std::map

于 2009-03-30T22:20:02.170 に答える
2

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

于 2009-03-30T22:24:20.523 に答える