2

これは可能ですか?

#include <map>

class Example {

  private:
  std::map<std::string, std::string, less<std::string>,
    std::allocator< CustomPair<std::string, std::string> > > myMap;
};

上記の例では、CustomPair はキーと値を保持するテンプレート クラスになります。これが可能であれば、それは簡単ですか、それとも私が注意すべきことはありますか?

4

4 に答える 4

7

ここではあなたの本当の意図が何であるかを推測することしかできないので、キーと値の両方を含むクラスがすでにあると思います。その場合、カスタム比較を使用したstd :: setは、std::mapよりも適切な選択となる可能性があります。

次に、クラスのキー部分のみを比較する比較を提供する必要があります。オブジェクトがセット内にある限り、キー部分はconst(時間の経過とともに変化しない)である必要があります。コメントで述べたように、セットの要素はconstsとしてのみアクセス可能であるため、そのような要素の値を変更する場合は、書き込みアクセスをconst_castするか、メンバーを変更可能として宣言する必要があります。

別の答えでは、 iainは別の非常に良い提案をしました。コンテナに挿入することがめったになく、ほとんどの場合、要素を検索するコンテナにアクセスする場合は、ソートされたstd::vectorとstd::binary_searchがセットの非常に効果的な代替手段です。

于 2009-05-20T15:30:08.227 に答える
3

std::setを使用する可能性が高くなります。

于 2009-05-20T15:30:51.093 に答える
3

lothar で説明されているセットを使用するかstd::vector、「効果的な STL」の第 23 章「連想コンテナーをソートされたベクトルで置き換えることを検討してください」で説明されているようにソートを使用します。

これの合理的な理由はstd::binary_search、カスタム コンパレータを使用した並べ替えられたベクトルの速度は、マップ ルックアップとほぼ同じか、場合によっては高速であり、反復がはるかに高速であるためです。ただし、挿入操作はより高価です (各挿入後に sort を呼び出す必要があります)。ただし、マップのユース ケースの多くは挿入頻度が非常に低いです。

ベクターはセットよりも柔軟性があります。

2000 の複雑なオブジェクト (int でインデックス付け) のマップをこのアプローチに置き換えました。マップ内のすべてのオブジェクトの反復と処理は、サーバー クラス システムで 50 秒から 5 秒未満になりました。マップ ルックアップ時間に顕著な違いはありませんでした。

于 2009-05-20T16:27:28.733 に答える
-2

できると思いますが、目的の効果が得られませstd::allocatorん。実際、そこにどのタイプを入れても問題ないでしょう。STL 関数はそれを無視します。少なくとも彼らの何人かは間違いなくそうするでしょうが、私はすべてがそうするかどうかはわかりません. 厳密に言えば、これはほぼ確実に実装依存です。基準が何を言っているのかわからない。rebind<std::pair>CustomPair

于 2009-05-20T16:00:30.957 に答える